Как я могу исключить каталог по имени, используя find?

7

У меня есть много каталогов в моей системе со структурой, которая выглядит так:

\-----data
       \------- 001abc
       \------- 002abc
       \------- 003abc
       \------- 004abc
       \------- 005abc
       \ ....

Когда я хочу найти определенный каталог, я просто набираю find . -iname "002abc*" , но как я могу найти каталог, исключая определенные совпадения имен?

Что-то вроде этого в MySQL select * from folder where filename != '0021bc'

    
задан Egy Mohammad Erdin 15.01.2013 в 14:12
источник

3 ответа

7

Используйте ! в команде find , чтобы отменить (инвертировать) параметр, следующий за ним. В вашем случае:

find . ! -iname "002abc*"

и необязательно, только соответствующие папки:

find . ! -iname "002abc*" -type d

отобразит все папки, кроме тех, которые соответствуют шаблону 002abc* .

! иногда может быть проблематичным в сценариях оболочки, поэтому как указал Флимм , параметр -not - очень полезный синоним.

    
ответ дан gertvdijk 15.01.2013 в 14:25
источник
2
find -name 0021bc -prune -o -print
    
ответ дан Steven Penny 22.06.2014 в 23:44
1

Вы можете найти все папки, а затем выбрать тот, который вы не хотите, с помощью grep -v (или egrep, если на то пошло)

find . -iname "abc*" | grep -v 002

Если вы хотите выбрать более одного имени, вы можете использовать последовательный grep -v или один оператор egrep.

find . -iname "abc*" | grep -v 002 | grep -v 003

или

find . -iname "abc*" | egrep -v "002|003"

Вам нужно настроить его на то, что вы хотите, и я счастлив повторить. Если вы читаете справочную страницу для поиска, вы найдете множество флагов для сортировки файлов и папок тоже.

    
ответ дан philshem 15.01.2013 в 14:22