一連の「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")
$i
awk
変数として渡されました。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/コードを確認してください。 (プライベートコードの共有が心配な場合は、ローカルにインストールしてください。)