何も返さない、またはnullを返すコマンドの出力をどのようにエコーしますか?

何も返さない、またはnullを返すコマンドの出力をどのようにエコーしますか?

何も返さないコマンドの出力から何かをエコーし​​たいです。

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

関連情報