4

bashスクリプトを使用して、ファイル名に特定の単語を含むディレクトリ内のすべてのファイルをループしようとしています。

次のスクリプトは、ディレクトリ内のすべてのファイルをループします。

cd path/to/directory

for file in *
do
  echo $file
done

ls | grep 'my_word'ファイル名に「my_word」という単語が含まれるファイルのみが表示されます。ただし、 * を ls | に置き換える方法がわかりません。スクリプトで grep 'my_word' を実行します。

私がこのようにしたら、

for file in ls | grep 'my_word'
do
  echo $file
done 

「予期しないトークン `|' に近い構文エラー」というエラーが表示されます。これを行う正しい方法は何ですか?

4

1 に答える 1

10

可能な限り、 lsの解析は避けてください。現在のディレクトリにサブディレクトリがないと仮定すると、通常はglobで十分です。

for file in *foo*; do echo "$file"; done

1つ以上のサブディレクトリがある場合は、を使用する必要がある場合がありますfind。たとえばcat、ファイルに対して:

find . -type f -name "*foo*" | xargs cat

または、ファイル名に特殊文字が含まれている場合は、次を試してください。

find . -type f -name "*foo*" -print0 | xargs -0 cat

または、プロセス置換whileループを使用することもできます。

while IFS= read -r myfile; do echo "$myfile"; done < <(find . -type f -name '*foo*')

または、ファイル名に特殊文字が含まれている場合は、次を試してください。

while IFS= read -r -d '' myfile; do
  echo "$myfile"
done < <(find . -type f -name '*foo*' -print0)
于 2012-08-09T06:25:09.397 に答える