найти конкретное расширение файла командой find - PullRequest
1 голос
/ 17 января 2012

Я хотел бы найти любые файлы в данном корне, которые содержат произвольные расширения в имени файла. Я видел этот пост: Как удалить все файлы с определенным суффиксом до расширения файла

Основываясь на этой информации, я попробовал это:

find . -iregex ".*\.\(wav\|aif\|wave\|aiff\)"

Кажется, что должно работать, но я не получаю никаких результатов, напечатанных в окне терминала.

Кто-нибудь может дать совет? Я на OSX 10.7

Спасибо, JML

Ответы [ 2 ]

5 голосов
/ 17 января 2012

Вы ищете:

find . -regex ".*\.\(wav\|aif\|wave\|aiff\)"

Вам не хватает escape, \, символы на или, |, операторы

2 голосов
/ 17 января 2012

Это регулярное выражение в стиле emacs?

Если нет, попробуйте использовать -regextype. Со страницы руководства find в Linux (архаичный):

  • -regextype type

    Изменяет синтаксис регулярного выражения, понятный тестам -regex и -iregex, которые выполняются позже в командной строке. В настоящее время реализованы типы emacs (по умолчанию), posix-awk, posix-basic, posix-egrep и posix-extended.


В MacOS X на странице руководства для find написано:

-iregex pattern

Как и -regex, но совпадение не чувствительно к регистру.

-regex pattern

Истина, если полный путь к файлу соответствует шаблону с использованием регулярного выражения. Чтобы сопоставить файл с именем ./foo/xyzzy, вы можете использовать регулярное выражение .*/[xyz]* или .*/foo/.*, но не xyzzy или /foo/.

Некоторые эксперименты показывают, что:

find pdf -iregex ".*/.*.pdf"

находит в моей папке очень много файлов PDF, но ни один из этих вариантов ничего не находит:

find pdf -iregex ".*/.*\.(pdf|doc|docx)"
find pdf -iregex ".*/.*\.\(pdf|doc|docx\)"
find pdf -iregex ".*/.*.(pdf|doc|docx)"
find pdf -iregex ".*/.*.\(pdf|doc|docx\)"

Следовательно, необходимо предположить, что регулярные выражения, поддерживаемые MacOS X (BSD) find, не включают чередование (круглые скобки и каналы) среди распознанных символов. «Жаль, что man 7 re_format подразумевает, что может, но это не так. Кажется, опция -regextype не поддерживается в MacOS X (BSD).

Итак, может быть проще всего установить GNU find, или выполнить N отдельных поисков для N различных расширений файлов, или выполнить один поиск файлов в целом и использовать egrep '\.(aff|wave?|aiff)$', чтобы перехватить интересующие вас файлы in. Это скорее предполагает, что вы не используете переводы строк в именах файлов (пробелы и т. д. в порядке, но переводы строк нет).

...