Есть ли простой способ рекурсивного поиска всех файлов в иерархии каталогов, которые не заканчиваются в списке расширений? Например, все файлы, которые не являются * .dll или * .exe
UNIX / GNU find, как бы он ни был мощен, похоже, не имеет exclude
режима (или я его упускаю), и мне всегда было трудно использовать регулярные выражения для поиска вещей, которые не соответствуют определенному выражению ,
Я нахожусь в среде Windows (использую порт GnuWin32 большинства инструментов GNU), поэтому я в равной степени открыт для решений только для Windows.
command-line
find
Кристиан Дьяконеску
источник
источник
-not
Может быть заменено на'!'
(Цитата рекомендуется). С другой стороны,-name
чувствителен к регистру, а-iname
нечувствителен к регистру.источник
-not
плохой вариант, этот с!
хорошо работает :)У первых двух опций -name нет опции -print, поэтому они пропущены. Все остальное напечатано.
источник
Вы можете сделать что-нибудь, используя команду grep:
Этот
-v
флагgrep
специально означает «найти вещи, которые не соответствуют этому выражению».источник
еще один :-)
Unix найти ссылку на команду
источник
источник
Linux / OS X:
Начиная с текущего каталога, рекурсивно найдите все файлы, заканчивающиеся на .dll или .exe
Начиная с текущего каталога, рекурсивно находите все файлы, которые НЕ заканчиваются в .dll или .exe
Ноты:
(1) Опция P в grep указывает, что мы используем стиль Perl для написания наших регулярных выражений, которые будут использоваться вместе с командой grep . В целях исключения команды grep в сочетании с регулярными выражениями я обнаружил, что стиль Perl является наиболее мощным стилем.
(2) Опция v в grep указывает оболочке исключить любой файл, который удовлетворяет регулярному выражению
(3) Символ $ в конце слова «.dll $» является управляющим символом-разделителем, который сообщает оболочке, что строка имени файла заканчивается на «.dll».
источник
Другие решения на этой странице нежелательны, если у вас длинный список расширений - поддержание длинной последовательности
-not -name 'this' -not -name 'that' -not -name 'other'
будет утомительным и подверженным ошибкам - или если поиск является программным, а список расширений создается во время выполнения.Для этих ситуаций
find
может быть желательно решение, которое более четко разделяет данные (список расширений) и код (параметры ). Учитывая структуру каталогов и файлов, которая выглядит следующим образом:Вы можете сделать что-то вроде этого:
Что приводит к:
Вы можете изменить список расширений без изменения блока кода.
NOTE не работает с родным OSX
find
- используйте вместо этого gnu find.источник