1

У меня есть каталог фотографий, чьи имена являются временем и датой, когда была сделана фотография. Например:

~$ ls directory -1
2003-09-15 03.30.33.jpg
2004-05-04 12.45.28.jpg
2004-05-04 12.45.51.jpg

Однако, если я выполню эту команду как часть цикла for и выведу вывод, пробелы в именах файлов будут рассматриваться как новые строки:

~$ for pic in `ls directory -1` ; do echo  "$pic"; done
2003-09-15
03.30.33.jpg
2004-05-04
12.45.28.jpg
2004-05-04
12.45.51.jpg

Почему это происходит, и как я могу это остановить?

3 ответа3

4

Поскольку другие ответы тесно связаны, проблема заключается в том, как цикл обрабатывает выходные данные команды ls . Когда строка используется в цикле for как она у вас есть, строка разбивается на разные слова (в зависимости от значения IFS как говорит Даррен) и подвергается глобализации и тому подобному. Это означает, что вы передаете строку, которая разделяется как на строку, так и на пробелы в строке, а затем каждое из этих слов в свою очередь устанавливается на pic .

Предложение Камиля решает эту проблему, потому что вы позволяете глобусу расширяться до всех имен файлов напрямую, а затем все имя файла присваивается pic .

Это разделение слов будет происходить везде, где вы позже будете использовать переменную pic , поэтому, если вы не хотите, чтобы это произошло, обязательно поставьте двойные кавычки. Например,

for pic in *; do
    printf '%s\n' "$pic"
done

напечатать каждое из имен, по одному в строке.

3

В вашем случае может быть достаточно простого сглаживания оболочки:

for pic in * ; do …

Таким образом, вы также избегаете парсинга ls что, в общем, не очень хорошая идея.

1

На вопрос ответили здесь. Краткий ответ - запустить эту команду:

IFS=$(echo -en "\t\n\0")

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .