Bash:「if」と「find」を一緒に使用して、フォルダ内のファイルを確認してください。

Bash:「if」と「find」を一緒に使用して、フォルダ内のファイルを確認してください。

一連の「histogram_0000_0000」フォルダを含む親フォルダがあります。すべてのフォルダで "out.txt"ファイルを検索し、フォルダ内のファイルが見つかるたびにそれを返すbashスクリプトを作成しようとしています(ファイルがすべてのフォルダにあることを確認するため)。私が得たスクリプトは次のとおりです。

#!/bin/bash
joblist='job_list.txt'
njobs=`wc ${joblist} | awk '{print $1}'`

cwd=`pwd`
for ((i=1 ; i <= ${njobs} ; i++ )); do
        folder=`awk '(NR=='${i}'){print}' ${joblist}`
        echo $folder
        cd ${folder}
        if [ find -name "out.txt" ]
        then
                echo out.txt found in $folder
        fi
        cd ${cwd}
done

しかし、実行するたびにエラーが発生します。

./checkrun.sh: 10行目: [: -name: バイナリ演算子が必要

周りを見回して「[[」と「]]」を使ってみましたが、なぜ運が良いのかわかりません!どんな助けでもいいでしょう。ありがとう、ジャック

ベストアンサー1

[...]文字列または数値式をテストします。コマンドが一致することを確認するには、find出力(空でない文字列、を使用してテスト-n)を提供するかどうかをテストする必要があります。

if [[ -n "$(find -name 'out.txt')" ]]
then
    echo "out.txt found in $folder"
fi

$(...)コマンドの出力をキャプチャするために廃止された逆引用符の代わりに最新の構文を使用しています`...`

他の提案、

  • 行数を取得するnjobs=にはwc $ {joblist} | awk '{print $1}'``を簡素化できます。njobs=$(wc -l <"$joblist")

  • $iawk変数として渡されました。folder=$(awk -v i="$i" 'NR==i {print}' "$joblist}")

  • cdサブフォルダに移動してから、cd元の場所に戻らないでください。サブディレクトリを参照するには相対パスを使用し、制限されたcdコンテキストでサブディレクトリを維持するにはサブシェルを使用します。ここでは最初の方法を使用します。

      echo "$folder"
      if [[ -n "$(find "$folder" -name 'out.txt')" ]]
      then
          echo "out.txt found in $folder"
      fi
    
  • 常に相対パスの場合、パス$folderとして使用される場所ごとに「./$folder」と呼ばれます。これにより、-ダッシュ()で始まり、ダッシュ()を一連のオプションとして解釈するコマンドに混乱を招く可能性があります。

  • シェルにはbashすでに現在の作業ディレクトリの変数があるため、次cwd=`pwd`のように単純化できます。cwd="$PWD"

  • 使用https://shellcheck.net/コードを確認してください。 (プライベートコードの共有が心配な場合は、ローカルにインストールしてください。)

おすすめ記事