特定のディレクトリのすべての子ディレクトリ (ファイルではない) をループする 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"
、次の出力が生成されます。
チェリー 丘 新しい ヨーク 街