特定のディレクトリのすべての子ディレクトリ(ファイルではない)をループするbashシェルスクリプトがあります。問題は、一部のディレクトリ名にスペースが含まれていることです。
これが私のテストディレクトリの内容です。
$ls -F test
Baltimore/ Cherry Hill/ Edison/ New York City/ Philadelphia/ cities.txt
そして、ディレクトリをループするコード:
for f in `find test/* -type d`; do
echo $f
done
出力は次のとおりです。
テスト/ボルチモア テスト/チェリー 丘 テスト/エジソン テスト/新規 ヨーク 市 テスト/フィラデルフィア
Cherry HillとNew York Cityは、2つまたは3つの別々のエントリとして扱われます。
私は次のようにファイル名を引用しようとしました:
for f in `find test/* -type d | sed -e 's/^/\"/' | sed -e 's/$/\"/'`; do
echo $f
done
しかし、役に立たない。
これを行う簡単な方法がなければなりません。
以下の答えは素晴らしいです。しかし、これをより複雑にするために、テストディレクトリにリストされているディレクトリを常に使用する必要はありません。代わりに、コマンドラインパラメータとしてディレクトリ名を渡したい場合があります。
私はIFSを設定するというチャールズの提案を取り入れ、次のことを思いつきました。
dirlist="${@}"
(
[[ -z "$dirlist" ]] && dirlist=`find test -mindepth 1 -type d` && IFS=$'\n'
for d in $dirlist; do
echo $d
done
)
コマンドライン引数にスペースが含まれていない限り(これらの引数が引用符で囲まれている場合でも)、これは問題なく機能します。たとえばtest.sh "Cherry Hill" "New York City"
、次のようなスクリプトを呼び出すと、次の出力が生成されます。
チェリー 丘 新着 ヨーク 市
list="$@"
元の値のリストネスを完全に破棄し、文字列に折りたたみます。与えられたとおりに私の回答の実践に従ってください-そのような割り当てはその中のどこにも奨励されていません。コマンドライン引数のリストをプログラムに渡したい場合は、それらを配列に収集し、その配列を直接展開する必要があります。