ディレクトリ名を for ループに入力しようとしています。コードは次のとおりです。
td='/Test/TopDir/'
cd "$td"
for x in $(ls -d */ | cut -f1 -d'/'); do
echo x=$x
done
これを実行する最上位ディレクトリは、ls コマンドを実行すると次のようになります。
ls -l
drwxrwxrwx 4 Jason users 4096 May 6 06:36 2014-02-02 - Jebby (
drwxrwxrwx 3 Jason users 4096 May 6 06:09 2014-02-04 - Jebby (
drwxrwxrwx 2 root root 4096 May 6 06:09 @eaDir
-rw-r--r-- 1 Jason users 3956225 Jan 26 10:17 DSC01062.JPG
-rw-r--r-- 1 Jason users 3927603 Jan 26 10:18 DSC01063.JPG
for ループの結果は次のようになります。
x=2014-02-02
x=-
x=Jebby
x=(
x=2014-02-04
x=-
x=Jebby
x=(
x=@eaDir
ご覧のとおり、for ループは各スペースの後のディレクトリ名をサブピースに分割しています。この例では、3 つのディレクトリで For ループを 3 回だけ実行します。
- 2014-02-02 - ジェビー (
- 2014-02-04 - ジェビー (
- 翻訳者
何が間違っているのでしょうか?
答え1
ls
可能な限り、シェル スクリプトでの出力 (または少なくともファイル名の部分) の解析は避けてください。ファイル名に空白が含まれている場合、単語分割で常に問題が発生します。
ディレクトリを反復処理したい場合は、単純なシェルグロブを使用して実行できます。
for d in */; do
echo "$d"
done
このls
コマンドは、ターミナルで人間が読める形式でディレクトリ リストを表示するためにのみ使用してください。
答え2
@mikserv の提案、 できるよ
cd /Test/TopDir/
set -- "$PWD" */
cd /somewhere/else
td=$1 ; shift
for x; do
echo x="${td}/$x"
done