3

Я перенял у кого-то еще много исторических данных. Однако имена файлов полностью случайны и плохо отформатированы ИМХО.

Для начала я хочу получить список всех файлов, которые содержат пробелы или любой другой символ, кроме AZ, 0-9,., -, _. Есть ли способ сделать это с помощью синтаксиса регулярных выражений из командной строки в Linux?

3 ответа3

2
find . -type f | grep -i '[^a-z0-9\.\/_\-]'

Это будет соответствовать всем файлам, которые содержат символы, отличные от a-z , 0-9 , точку, косую черту (для каталогов), подчеркивание или дефис-минус.

Примечание. Это не будет работать, если файл (или путь) содержит символ новой строки, потому что при передаче по grep путь к файлу будет разделен на две части. Хотя это не очень распространено, это следует упомянуть.


Простое решение с помощью Zsh (для этого требуется setopt EXTENDED_GLOB):

ls -l **/*[^a-zA-Z0-9-_.]##*

** возвращается в каталоги, а * соответствует нулю или более вхождений любого символа. Отрицательный шаблон символов из белого списка должен совпадать хотя бы один раз (##).

0

Если у вас есть команда locate, вы можете сделать что-то вроде этого:

locate --basename --regex "[^0-9A-Za-z\.\_\-]"

В системах Centos вы можете установить locate, запустив yum -y install updatedb. Затем вам нужно будет выполнить команду updatedb, а затем запустить locate.

В этой команде базовое имя заставляет locate искать только имя файла, а не полный путь к каталогу, и регулярное выражение выполняет заданный регистр выражений для этого имени файла.

-1

Это выделит странные файлы, но не напечатает только их:

находить . тип -maxdepth 1 | grep --color = 'auto' [[:alnum:]]

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