У меня такая структура каталогов
data
|___
|
abc
|____incoming
def
|____incoming
|____processed
123
|___incoming
456
|___incoming
|___processed
Во всех папках внутри каталога данных есть входящая подпапка. Я хочу получить все файлы из всех папок и подпапок, кроме каталогов def / incoming и 456 / incoming. Я попробовал следующую команду
find /home/feeds/data -type d \( -name 'def/incoming' -o -name '456/incoming' -o -name arkona \) -prune -o -name '*.*' -print
но он работает не так, как ожидалось.
Ravi
grep -v something
чтобы исключить все, что вам не нужноОтветы:
Это работает:
Объяснение:
find /home/feeds/data
: начать поиск рекурсивно с указанного пути-type f
: найти только файлы-not -path "*def/incoming*"
: не включать ничего сdef/incoming
как часть своего пути-not -path "*456/incoming*"
: не включать ничего с456/incoming
как часть своего путиисточник
-path
соответствует всей строке, так что, если вы это делаетеfind .
, ваши-path
строки должны быть./path/to/directory/*
-not -path
определенно будет работать в этом примере, ноfind
все еще перебирает структуру каталогов и использует циклы процессора для перебора всех этих каталогов / файлов. чтобы предотвратитьfind
итерацию по этим каталогам / файлам (возможно, там миллионы файлов), вам нужно использовать-prune
(-prune
однако этот параметр сложно использовать).Просто для документации: вам, возможно, придется копнуть глубже, поскольку существует множество созвездий search'n'skip (как и мне). Может оказаться, что
prune
ваш друг-not -path
не сделает того, чего вы ожидаете.Итак, это ценный пример из 15 примеров поиска, исключающих каталоги:
http://www.theunixschool.com/2012/07/find-command-15-examples-to-exclude.html
Чтобы связать с исходным вопросом, исключение, наконец, сработало для меня следующим образом:
Затем, если вы хотите найти один файл и по-прежнему исключить пути, просто добавьте
| grep myFile.txt
.Это также может зависеть от вашей версии поиска. Я вижу:
источник
-name
соответствует только имени файла, а не всему пути.-path
Вместо этого вы хотите использовать для частей, в которых вы сокращаете каталоги, напримерdef/incoming
.источник
источник
find ... -print0
вместе с более позднимxargs -0
Следуя инструкциям по исключению каталога из find. команда :
источник