for
-loop は、指定された文字列の (スペースで区切られた) 各エントリを反復処理します。
find
を実際に実行するわけではありません コマンドですが、文字列として指定します (これは for
によって反復されます) -loop). 二重引用符の代わりに、バッククォートまたは $()
を使用します。 :
for line in $(find . -iname '*.txt'); do
echo "$line"
ls -l "$line"
done
さらに、ファイルのパス/名前にスペースが含まれている場合、このメソッドは失敗します (for
-loop は、スペースで区切られたエントリを反復します)。代わりに、dogbanes answer で説明されている方法を使用することをお勧めします。
エラーを明確にするには:
前述のとおり、for line in "find . -iname '*.txt'";
スペースで区切られたすべてのエントリを繰り返し処理します。
- 見つける
- .
- イナメ
- '*.txt' (だと思います...)
最初の 2 つは (望ましくない動作を除いて) エラーにはなりませんが、3 番目は実行時に問題があります:
ls -l -iname
多くの (bash) コマンドは 1 文字のオプションを組み合わせることができるため、 -iname
-i -n -a -m -e
と同じです .出来上がり:invalid option -- 'e'
エラー!
ファイル名のスペースと改行を処理するため、ファイルをループするより良い方法を次に示します。
#!/bin/bash
find . -type f -iname "*.txt" -print0 | while IFS= read -r -d $'\0' line; do
echo "$line"
ls -l "$line"
done
コマンドを文字列として渡す代わりに、引用符の代わりにコマンド置換を使用して検索を実行します:
for line in $(find . -iname '*.txt'); do
echo $line
ls -l $line;
done
ファイル名にスペースと改行を使用した、よりコンパクトなバージョン:
find . -iname '*.txt' -exec sh -c 'echo "{}" ; ls -l "{}"' \;