何も返さないコマンドの出力から何かをエコーしたいです。
fnames.txt の内容です。
company_TOYOTA_666_696969696*
company_FORD_123_435345666*
company_MAZDA_333_333333333*
company_HONDA_777_777777777*
company_FERARI_999_999999999*
fnames.txtの1行で各ファイルを検索するスクリプトは次のとおりです。
#!/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
一致が印刷され、コマンドはゼロを返します。一致するものがなければ、何も印刷されず、ゼロ以外の戻り値が返されます。|| 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