Как перебирать файлы с кавычками в имени файла?

#linux #bash

#linux #bash

Вопрос:

У меня есть набор файлов в /home/user/ source . Один файл в этом наборе имеет имя ‘e e’ (в одинарных кавычках). Когда я попытался перебрать этот набор файлов и распечатать все имена файлов, я получил этот файл с именем e e (кавычки не были указаны). Как написать этот цикл, чтобы сохранить эти кавычки в выходных данных? Вот код:

 #!/bin/bash
for existedFile in "$(ls /home/user/source)"
do
    echo $existedFile
done
 

Запутанный момент здесь, когда я просто использую ls /home/user/source вывод, правильный.

Комментарии:

1. используйте глобус: for existedFile in /home/user/source/*; do printf '%sn' "$existedFile"; done

2. в моем случае не работает

3. Сделайте то, что bash говорит тег, который вы использовали, и скопируйте / вставьте свой скрипт в shellcheck.net чтобы исправить большинство, если не все ваши проблемы.

4. @Alkaf: это создает файл с именем e e , кавычки удаляются из командной строки во время удаления кавычек (см. man bash ). Используйте touch "'e e'" или touch 'e e' для создания файла с именем 'e e' .

5. @Alkaf «не работает в моем случае» : как так?

Ответ №1:

Не анализируйте вывод ls

Вывод ls может содержать что угодно. Он может содержать пробелы, новые строки, запятые, символы канала и т. Д. Это может быть чрезвычайно вредным в сценарии.

Вместо этого выполните итерацию по глобусу : * . Звездочка — это сокращение для «все в этом каталоге». Bash позаботится о переборе файлов. Если вам нужно сопоставить определенный тип / шаблон файла, вы можете использовать *.java file*.f90 , и т.д.