Как найти файлы, содержащие переводы строк в их именах

Так много говорится о правильной обработке имен файлов, которые содержат странные символы, такие как переводы строк. Я думал, что использование IFS, установленного на newline, решит проблему в целом, за исключением очевидного случая, если в нем есть имя с символом новой строки. Таким образом, в качестве средства защиты сценарий может сначала проверить, есть ли у поддерева хотя бы один файл с символом новой строки, и остановиться с сообщением, чтобы сначала исправить имя. Удивительно, но я не смог find делать это с -regex матч. Единственный способ добиться успеха был довольно уродливым

find . -name "*"$'\n'"*"

Но например find . -regex ".*\n.*" не работает. Регулярное выражение Emacs должно позволять экранировать символы вроде \ n, не так ли? Интересно, что это соответствует другому файлу с символом n во имя. Экспериментировал с разными -regextypes только чтобы найти эти типы awksedposix-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.*"
Другие вопросы по тегам