2011-12-30 27 views
33

ファイル名に含まれる文字を気にせずにファイルのリストを繰り返し処理したいので、ヌル文字で区切られたリストを使用します。コードは物事をよりよく説明します。Bashループでヌル区切り文字列を読む

# Set IFS to the null character to hopefully change the for..in 
# delimiter from the space character (sadly does not appear to work). 
IFS=$'\0' 

# Get null delimited list of files 
filelist="`find /some/path -type f -print0`" 

# Iterate through list of files 
for file in $filelist ; do 
    # Arbitrary operations on $file here 
done 

次のコードは、ファイルから読み込むときに機能しますが、テキストを含む変数から読み込む必要があります。 bashで

while read -d $'\0' line ; do 
    # Code here 
done < /path/to/inputfile 
+1

bash変数にヌル文字を格納することはできません。少なくとも、私はそれをする方法を見つけたことがありません... –

答えて

53

あなたがIFS=をインライン化し、ちょうど-d ''を使用しますが、「D」と単一最初の間にスペースがあることを確認する必要があり、ここで、文字列

while IFS= read -r -d '' line ; do 
    # Code here 
done <<<"$var" 

注意を使用することができます-見積もり。また、エスケープを無視するために、-rフラグを追加します。

また、これはご質問の一部ではありませんが、findを使用する場合はスクリプトを実行するより良い方法をお勧めします。プロセス置換を使用します。

while IFS= read -r -d '' file; do 
    # Arbitrary operations on "$file" here 
done < <(find /some/path -type f -print0) 
+0

優れた、まさに私が探していたもの。ありがとう!私はあなたの2番目の例を使用して終了しました。 – Matthew

+0

-dフラグが設定されているため、IFSの使用は何ですか? – thisirs

+4

@thisirs 'IFS'にヌル文字列を設定すると、先頭と末尾の空白文字が保存されます。 – toxalot

関連する問題