2013-03-15 5 views
0

Я пытаюсь создать цикл for в папках, содержащих пробелы, запятую и скобки. Например: Italy - Rimini (Feb 09, 2013)bash for loop в каталогах с символами

Сначала он сканирует родительскую папку/альбомы для подпапок, которые выглядят как в приведенном выше примере. Затем он выполняет завихренные действия над файлами в подпапках. Он отлично работает, если вложенные папки не содержат пробелов, запятых или других символов.

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

Но если есть такие символы, кажется, скручивание немного застревает - он не может найти $ файл (возможно, потому, что $ реж неверно).

Я могу заменить все символы в подразделах или удалить их или переименовать папки в 001, 002, и он работает безупречно. Но прежде чем прибегать к этому, я хотел бы знать, можно ли его решить, используя трюки bash, сохраняя неподходящее имя подпапки?

+2

читать о 'find -print0 | xargs ... 'здесь, в StackOverflow. 100 примеров. Удачи. – shellter

+1

Нехорошо перебирать вывод 'ls', так как имя файла может содержать такие забавные символы, как' \ n'. – mtk

ответ

1

Ознакомиться с концепцией слово split вашей оболочки. Тогда поймите, что использование ls для получения списка файлов с пробелами задает проблемы. Вместо этого используйте оболочки подстановки, а затем котировка разложения:

cd /albums 
for dir in *; do 
    for file in /albums/"$dir"/*; do 
    echo x"$dir"x"$file"x 
    done 
    php match.php 
done 
+0

Это выглядит лучше. Я получил немного больше. Благодаря! Я узнал, что cURL не поддерживает загрузку файлов, содержащих запятую. https://code.google.com/p/plowshare/issues/detail?id=550 – zataived

0

Для задач с пробелами в именах файлов, вы должны изменить IFS для

IFS=' 
' 

, который говорит оболочку, что только разрывы строки являются разделителями файлов. По умолчанию IFS устанавливается на вкладки, пробелы и разрывы строк.

Поэтому просто поставьте это до начала цикла, и оно будет работать с именами файлов, которые содержат пробелы.

И, конечно, введите цитаты вокруг ваших переменных.

Смежные вопросы