Поиск UNIX для поиска имен файлов, не заканчивающихся конкретными расширениями?

Есть ли простой способ рекурсивного поиска всех файлов в иерархии каталогов, которые не заканчиваются в списке расширений? Например, все файлы, которые не являются * .dll или * .exe

Поиск UNIX / GNU, насколько это возможно, не имеет режима exclude (или мне его не хватает), и мне всегда было трудно использовать регулярные выражения для поиска вещей, которые не соответствуют определенному выражение.

Я в среде Windows (с использованием порта GnuWin32 большинства инструментов GNU), поэтому я одинаково открыт для решений только для Windows.

    Или без ( и необходимость избежать этого:

     find . -not -name "*.exe" -not -name "*.dll" 

    и также исключить список каталогов

     find . -not -name "*.exe" -not -name "*.dll" -not -type d 

    или в положительной логике 😉

     find . -not -name "*.exe" -not -name "*.dll" -type f 
     find . ! \( -name "*.exe" -o -name "*.dll" \) 
     $ find . -name \*.exe -o -name \*.dll -o -print 

    В первых двух вариантах имени нет опции -print, поэтому они пропущены. Все остальное напечатано.

    Вы можете сделать что-то, используя команду grep:

     find . | grep -v '(dll|exe)$' 

    Флаг -v в grep специально означает «найти вещи, которые не соответствуют этому выражению».

    еще один 🙂

      $ ls -ltr
     всего 10
     -rw-r-r-- 1 скриптер linuxdumb 47 дек. 23 14:46 test1
     -rw-r-r-- 1 скриптер linuxdumb 0 янв. 4 23:40 test4
     -rw-r-r-- 1 скриптер linuxdumb 0 янв. 4 23:40 test3
     -rw-r-r-- 1 скриптер linuxdumb 0 янв. 4 23:40 test2
     -rw-r-r-- 1 скриптер linuxdumb 0 янв. 4 23:41 file5
     -rw-r-r-- 1 скриптер linuxdumb 0 янв. 4 23:41 file4
     -rw-r-r-- 1 скриптер linuxdumb 0 янв. 4 23:41 file3
     -rw-r-r-- 1 scripter linuxdumb 0 янв. 4 23:41 file2
     -rw-r-r-- 1 скриптер linuxdumb 0 янв. 4 23:41 file1
     $ find.  Тип f!  -name "* 1"!  -name "* 2" -print
     ./test3
     ./test4
     ./file3
     ./file4
     ./file5
     $
    
    

    Ссылка на команду поиска Unix

    Linux / OS X:

    Начиная с текущего каталога, рекурсивно найдите все файлы, заканчивающиеся на .dll или .exe

     find . -type f | grep -P "\.dll$|\.exe$" 

    Начиная с текущего каталога, рекурсивно найдите все файлы, которые НЕ ДОЛЖНЫ заканчиваться на .dll или .exe

     find . -type f | grep -vP "\.dll$|\.exe$" 

    Заметки:

    (1) Параметр P в grep указывает, что мы используем стиль Perl для записи наших регулярных выражений, которые будут использоваться вместе с командой grep . Для исключения команды grep в сочетании с регулярными выражениями, я нахожу, что стиль Perl является самым мощным стилем.

    (2) Параметр v в grep указывает оболочке исключить любой файл, который удовлетворяет регулярному выражению

    (3) Символ $ в конце слова «.dell $» является символом управления разделителем, который сообщает оболочке, что строка имени файла заканчивается на «.dll»,

    Другие решения на этой странице нежелательны, если у вас длинный список расширений – сохранение длинной последовательности -not -name 'this' -not -name 'that' -not -name 'other' будет утомительным, и ошибка -prone – или если поиск является программным, а список расширений построен во время выполнения.

    Для этих ситуаций может быть желательным решение, которое более четко разделяет данные (список расширений) и код (параметры для find ). Учитывая структуру каталогов и файлов, которая выглядит так:

     . └── a ├── 1.txt ├── 15.xml ├── 8.dll ├── b │  ├── 16.xml │  ├── 2.txt │  ├── 9.dll │  └── c │  ├── 10.dll │  ├── 17.xml │  └── 3.txt ├── d │  ├── 11.dll │  ├── 18.xml │  ├── 4.txt │  └── e │  ├── 12.dll │  ├── 19.xml │  └── 5.txt └── f ├── 13.dll ├── 20.xml ├── 6.txt └── g ├── 14.dll ├── 21.xml └── 7.txt 

    Вы можете сделать что-то вроде этого:

     ## data section, list undesired extensions here declare -a _BADEXT=(xml dll) ## code section, this never changes BADEXT="$( IFS="|" ; echo "${_BADEXT[*]}" | sed 's/|/\\|/g' )" find . -type f ! -regex ".*\.\($BADEXT\)" 

    Результат:

     ./a/1.txt ./a/b/2.txt ./a/b/c/3.txt ./a/d/4.txt ./a/d/e/5.txt ./a/f/6.txt ./a/f/g/7.txt 

    Вы можете изменить список расширений без изменения блока кода.

    ПРИМЕЧАНИЕ не работает с нативным OSX find – вместо этого используйте gnu find.

     find /data1/batch/source/export -type f -not -name "*.dll" -not -name "*.exe" 
    Interesting Posts

    Используйте функцию динамического ключевого слова / .NET 4.6 в Unity

    Нет типа данных для узла: org.hibernate.hql.internal.ast.tree.IdentNode HQL

    Как исходный код Android не имеет основного метода и все еще работает?

    Быстрое размытие растровых изображений для Android SDK

    Запускать внешнюю программу с Java, читать вывод, разрешать прерывание

    Настройка системных шрифтов для определенных языков

    Насколько дороги исключения в C #?

    SFTP через двойной серверный хоп

    Почему приведение int к недопустимому значению enums НЕ выбрасывает исключение?

    Как я могу переименовать набор имен файлов в Linux?

    Typcript: не может получить доступ к значению элемента в унаследованном конструкторе classа

    Ошибка в if / while (условие) {: отсутствует Значение, в котором требуется TRUE / FALSE

    Модуль GWT может потребоваться (повторно) скомпилировать REDUX

    Точка OpenCV (x, y) представляет (столбец, строка) или (строка, столбец)

    Почему gc () не освобождает память?

    Давайте будем гением компьютера.