2

Bash でファイルのリストを繰り返し処理し、何らかのアクションを実行したいと考えています。問題: ファイル名に空白が含まれている可能性があるため、ワイルドカードまたはls:

touch a\ b
FILES=* # or $(ls)

for FILE in $FILES; do echo $FILE; done

収量

a
b

これを処理する従来の方法は、find … -print0代わりに使用することです。ただし、これは と組み合わせてのみ (うまく) 機能しxargs -0、Bash 変数/ループでは機能しません。

私の考えは、$IFSこれを機能させるためにヌル文字に設定することでした。しかし、comp.unix.shell は、これは bash では不可能であると考えているようです。

残念。理論的には、次のような別の文字を使用することも可能です:(結局のところ、$PATHこの形式も使用します)。

IFS=$':'
FILES=$(find . -print0 | xargs -0 printf "%s:")

for FILE in $FILES; do echo $FILE; done

(出力はわずかに異なりますが、十分です。)

しかし、これは不器用で、もっと直接的な方法があるべきだと感じずにはいられません。これを達成するためのより直接的な方法を探しています。できればワイルドカードまたはls.

4

3 に答える 3

3

これを処理する最善の方法は、ファイル リストを文字列ではなく配列として保存することです (すべての変数置換を必ず二重引用符で囲んでください)。

files=(*)
for file in "${files[@]}"; do
    echo "$file"
done

の出力から配列を生成するfind場合 (たとえば、再帰的に検索する必要がある場合)、この前の回答を参照してください。

于 2012-04-18T14:37:22.553 に答える
1

最初の例とまったく同じように、Msys Bash、Cygwin、および Fedora ボックスで問題なく動作します。

FILES=*
for FILE in $FILES
do
    echo $FILE
done
于 2012-04-18T13:25:25.107 に答える
-2

先に進むことが非常に重要です

IFS=""

そうしないと、直後に 2 つのスペースが続くファイルが見つかりません。

于 2017-04-10T15:07:38.150 に答える