Как упоминалось здесь:
новые строки \n
в именах файлов являются проблемой, когда вывод ls
другой команде, потому что новая строка разделит одно имя файла на две строки.
Страница руководства ls
состояния:
-b, --escape print C-style escapes for nongraphic characters
-q, --hide-control-chars print ? instead of nongraphic characters
-1 list one file per line. Avoid '\n' with -q or -b
Итак, моя интерпретация такова: -b
или -q
options решает эту проблему. Или остались случаи, на которые этот подход не распространяется?
Как следующая команда будет обрабатывать выходные данные для устранения этих побегов? Как найти файлы глубже в дереве каталогов? Можно ли запускать на POSIX, кроме Linux? Версия ls для GNU выполняет некоторую фильтрацию по умолчанию, но это не во всех системах.
Эссе Дэвида Уиллера Исправление имен файлов Unix / Linux / POSIX: управляющие символы (например, новая строка), начальные тире и другие проблемы переходит к некоторым проблемам. Многие программы предполагают, что в качестве разделителей можно использовать различные управляющие символы, такие как \ n или \ t, поэтому файлы с ними могут быть проблематичными. Однако есть способы справиться с именами файлов, содержащими практически любые символы:
Стоит отметить, что если вы хотите обрабатывать полностью произвольные имена файлов, используйте «find. ... -exec », когда можно; это на 100% переносимый и может обрабатывать произвольно неудобные имена файлов. Более недавнее дополнение POSIX для поиска -exec ... {} + также может помочь. Итак, где вы можете, делайте такие вещи:
# This is correct and portable; painful if "command" gets long: find . ... -exec command {} ; # This is correct and standard; some systems don't implement this: find . ... -exec command {} +
Если вы можете предотвратить файлы, содержащие \ n, вы можете использовать трюк, установив разделитель поля ввода оболочки, чтобы просто сказать новую строку и табуляцию. Затем используйте переменную имени файла в сценарии оболочки.
IFS="`printf '\n\t'`"
for file in `find . -type f` ; do
some_command "$file" ...
done