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 ループは各スペースの後にディレクトリ名をサブ部分に分割します。この例では、For ループが 3 つのディレクトリに対して 3 回だけ実行されるようにします。
- 2014-02-02 - JB(
- 2014-02-04 - JB(
- @eaDir
私は何が間違っていましたか?
答え1
ls
可能であれば、シェルスクリプトの出力(または少なくともファイル名の一部)を解析しないでください。ファイル名にスペースが含まれている場合は、常に単語分割の問題があります。
ディレクトリを繰り返すには、単純なシェルglobを使用して実行できます。
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