我想从不返回任何内容的命令的输出中回显某些内容。
这是fnames.txt的内容
company_TOYOTA_666_696969696*
company_FORD_123_435345666*
company_MAZDA_333_333333333*
company_HONDA_777_777777777*
company_FERARI_999_999999999*
这是我的脚本,用于从 fnames.txt 中查找一行中的每个文件:
#!/bin/sh
while read -r LINE
do
output=$(find . -name "$LINE")
if [[ $output ]];
then
printf "$output\n"
elif [[ $output -eq 0 ]];
then
echo "$LINE Not Found"
fi
done < /path/to/fnames.txt
但是当我尝试执行它时,它只输出找到的文件,而不输出回显未找到的文件名的 elif 语句:
./company_TOYOTA_666_696969696_11_22_33_4542352345.dat
./company_FORD_123_435345666_11_22_33_4542352345.dat
./company_MAZDA_333_333333333_11_22_33_4542352345.dat
./company_HONDA_777_777777777_11_22_33_4542352345.dat
我希望它输出这样的内容:
./company_TOYOTA_666_696969696_11_22_33_4542352345.dat
./company_FORD_123_435345666_11_22_33_4542352345.dat
./company_MAZDA_333_333333333_11_22_33_4542352345.dat
./company_HONDA_777_777777777_11_22_33_4542352345.dat
company_FERARI_999_999999999* Not Found
答案1
您可以使用-z
和-n
字符串测试运算符:
String operators:
-z STRING True if string is empty.
-n STRING
STRING True if string is not empty.
例如
while read -r LINE; do
output=$(find . -name "$LINE")
if [[ -z "$output" ]]; then
echo "$LINE not found"
else
echo "$output"
fi
done < fnames.txt
company_TOYOTA_666_696969696* not found
./company_FORD_123_435345666asdfgh
company_MAZDA_333_333333333* not found
./company_HONDA_777_7777777771242jkk
company_FERARI_999_999999999* not found
在哪里
$ ls -1 company*
company_FORD_123_435345666asdfgh
company_HONDA_777_7777777771242jkk
答案2
我建议利用grep
并返回代码,让生活变得更简单。
while read -r LINE
do
find . -name "${LINE}" | grep "${LINE}" || echo "${LINE} not found"
done < /path/to/fnames.txt
这是如何运作的:
find . -name "${LINE}"
很确定你知道这个,在当前目录中查找匹配的文件${LINE}
| grep "${LINE}"
将输出通过管道传输到grep
.我们这样做是为了产生一个返回值,find
通常不会产生有用的值。如果grep
匹配某些内容,则将打印匹配项,并且命令返回 0。如果没有匹配任何内容,则不会打印任何内容,并返回非零返回值。|| echo "${LINE} not found"
这||
是一个 OR 管道,如果它之前的命令之一返回非零,它将被执行。因此,如果grep
返回非零(即没有找到匹配的文件),则执行此回显。如果之前的命令成功,则不会执行。
答案3
#!/bin/bash
while read -r LINE
do
output=$(find . -name "$LINE" 2> /dev/null)
if [[ -z $output ]]; then
echo "$LINE Not Found"
else
echo "$output"
fi
done < /path/to/fnames.txt