Как найти файлы, содержащие переводы строк в их именах
Так много говорится о правильной обработке имен файлов, которые содержат странные символы, такие как переводы строк. Я думал, что использование IFS, установленного на newline, решит проблему в целом, за исключением очевидного случая, если в нем есть имя с символом новой строки. Таким образом, в качестве средства защиты сценарий может сначала проверить, есть ли у поддерева хотя бы один файл с символом новой строки, и остановиться с сообщением, чтобы сначала исправить имя. Удивительно, но я не смог find
делать это с -regex
матч. Единственный способ добиться успеха был довольно уродливым
find . -name "*"$'\n'"*"
Но например find . -regex ".*\n.*"
не работает. Регулярное выражение Emacs должно позволять экранировать символы вроде \ n, не так ли? Интересно, что это соответствует другому файлу с символом n
во имя. Экспериментировал с разными -regextypes только чтобы найти эти типы awk
sed
posix-extended
и еще несколько будут соответствовать файл с новой строкой (скажем, a\nxxx
) но кроме того они будут сопоставлять файлы с символом n
также. Weird. С другой стороны, документация по GNU find ничего не говорит о поддержке экранированных символов, таких как \n
, Они действительно не поддерживаются, поэтому мы не можем использовать \t \n \r \a
и подобное в регулярных выражениях find?
1 ответ
Чтобы найти все файлы и каталоги, в которых есть новая строка, вы можете использовать этот POSIX-совместимый вызов find
:
find . -name '*
*'
где буквальный перевод строки заключен в одинарные кавычки. bash
поддерживает дополнительный синтаксис для указания новой строки:
find . -name \*$'\n'\*
ИЛИ чуть менее неуклюже
EOL=$'\n'
find . -name "*$EOL*"
Или используя -regex
:
find . -regex ".*$EOL.*"