2016-01-29 5 views
0

У меня есть каталог с именем test, который имеет подпапки в диапазоне дат, например 01, 02, ... 31. Все подпапки содержат файлы .bz2. Мне нужно искать все файлы с расширением .bz2, используя команду find, но исключая определенный диапазон каталогов. Я знаю о find . -name ".bz2" -not -path "./01/*", но писать -not -path "./01/*" было бы так жалко, если бы я хотел пропустить 10 каталогов. Итак, как бы я пропустил подкаталоги 01..19 в моей команде find?Исключить диапазон каталогов в команде find

ответ

4

Вы можете использовать групповые символы в шаблоне для опции -not -path:

find ./ -type f -name "*.bz2" -not -path "./0*/*" -not -path "./1*/* 

это позволит исключить все каталоги, начиная с 0 или 1. Или еще лучше:

find ./ -type f -name "*.bz2" -not -path "./[01]*/*" 
+0

Большое вам спасибо. работал как шарм. +1. – Rahul

3

Во-первых, вы можете помочь find, используя -prune, а не -not -path - это позволит избежать даже поиска в соответствующих каталогах.

К вашему главному - вы можете создать символ для вашего примера (числовая 01 до 19 лет):

find . -path './0[1-9]' -prune -o -path './1[0-9]' -prune -o -print 

Если диапазон менее удобен (например, от 05 до 25), вы можете создать диапазон в переменную Баш, а затем интерполировать, что в find команду:

a=("-path ./"{05..25}" -prune -o") 
find . ${a[*]} -print -prune 

(вы можете захотеть echo "${a[*]}" или printf '%s\n' ${a[*]}, чтобы увидеть, как это работает)

2

Для меня я нашел команду как самостоятельный инструмент, как-то громоздкий. Поэтому я всегда использую комбинацию для поиска только для поиска рекурсивного файла и grep, чтобы сделать фактический материал для изъятия/включения. Наконец, я передаю результаты третьей команде, которая будет выполнять действия, например, rm, чтобы удалить файлы, например.

Моя общая команда будет выглядеть примерно так:

find [root-path] | grep (-v)? -E "cond1|cond2|...|condN" | [action-performing-tool] 
  • корневой путь, где начать поиск рекурсивно
  • добавить -v опция используется, чтобы инвертировать результаты сопоставления.
  • cond1 - condN, условия для соответствия. Когда -v является инволюцией, то это условия для не матч.
  • действие-исполнительской-инструмент делает фактическую работу

Например, вы хотите, чтобы удалить все файлы не соответствие некоторых условий в текущем каталоге:

find . -not -name "\." | grep -v -E "cond1|cond2|cond3|...|condN" | xargs rm -rf 

Как вы можете видеть, мы ищем в текущем каталоге, указанном точкой в ​​качестве корневого пути: тогда мы хотим инвертировать результаты сопоставления, потому что мы хотим, чтобы все файлы не, соответствующие нашим условиям: и, наконец, мы передаем все найденные файлы rm, чтобы удалить их: я добавляю -rf к рекурсивному/принудительному удалению всех файлов. Я использовал команду find с -not -name ".", чтобы исключить текущий каталог, обозначенный обычно точкой.

Для actuall вопрос: Предположим, у нас есть каталог с помощью .git и .metadata каталога, и мы хотим, чтобы исключить их в нашем поиске:

find . -not -name "\." | grep -v -E ".git|.metadata" | [action-performing-tool] 

Надежда, что помогает!

Смежные вопросы