0

スペース、コンマ、括弧を含むフォルダーにforループを作成しようとしています。例えば: Italy - Rimini (Feb 09, 2013)

まず、親フォルダー/ albumsをスキャンして、上記の例のようなサブフォルダーを探します。次に、それらのサブフォルダー内のファイルに対してcurlアクションを実行します。サブフォルダにスペース、コンマ、またはその他の記号が含まれていない場合は、正常に機能します。

for dir in `ls /albums`;
do
    for file in /albums/$dir/*
    do
            curl http://upload.com/up.php -F uploadfile[]=@"$file" > out.txt
            php process.php 
    done
    php match.php
done

しかし、そのようなシンボルがある場合は、カールビットがスタックしているようです-$ fileが見つかりません(おそらく$ dirが正しくないため)。

サブディレクトリ内のすべてのシンボルを置き換えるか、それらを削除するか、フォルダの名前を001、002に変更すると、問題なく機能します。しかし、それに頼る前に、サブフォルダー名をそのままにして、bashトリックを使用して解決できるかどうかを知りたいですか?

4

2 に答える 2

1

シェルの単語分割の概念をよく理解してください。ls次に、スペースを含むファイルのリストを取得するために使用すると、問題が発生することに気付きます。代わりに、シェルグロブを使用してから、展開を引用します。

cd /albums
for dir in *; do
   for file in /albums/"$dir"/*; do
     echo  x"$dir"x"$file"x
   done
   php match.php
done
于 2013-03-15T10:58:45.303 に答える
0

ファイル名のスペースに関する問題については、IFSを次のように変更する必要があります。

IFS='
'

これは、改行だけがファイル区切り文字であることをシェルに通知します。デフォルトでは、IFSはタブ、スペース、および改行に設定されています。

したがって、ループが始まる前にこれを置くだけで、スペースを含むファイル名で機能します。

そしてもちろん、変数名を引用符で囲みます。

于 2013-03-15T11:01:20.273 に答える