Mam taką strukturę katalogów
data
|___
|
abc
|____incoming
def
|____incoming
|____processed
123
|___incoming
456
|___incoming
|___processed
We wszystkich folderach w katalogu Data znajduje się przychodzący podfolder. Chcę pobrać wszystkie pliki ze wszystkich folderów i podfolderów z wyjątkiem katalogów def / incoming i 456 / incoming. Wypróbowałem za pomocą następującego polecenia
find /home/feeds/data -type d \( -name 'def/incoming' -o -name '456/incoming' -o -name arkona \) -prune -o -name '*.*' -print
ale nie działa zgodnie z oczekiwaniami.
Ravi
grep -v something
aby wykluczyć to, czego nie chceszOdpowiedzi:
To działa:
Wyjaśnienie:
find /home/feeds/data
: zacznij szukać rekurencyjnie od określonej ścieżki-type f
: znajdź tylko pliki-not -path "*def/incoming*"
: nie uwzględniaj niczegodef/incoming
jako części swojej ścieżki-not -path "*456/incoming*"
: nie uwzględniaj niczego456/incoming
jako części swojej ścieżkiźródło
-path
pasuje do całego ciągu, więc jeśli robiszfind .
, twoje-path
struny muszą być./path/to/directory/*
-not -path
pewno zadziała w tym przykładzie, alefind
nadal iteruje w strukturze katalogów i używa cykli procesora do iteracji po wszystkich tych katalogach / plikach. aby zapobiecfind
iteracji po tych katalogach / plikach (być może są tam miliony plików), musisz użyć-prune
(-prune
opcja jest jednak trudna w użyciu).Tylko ze względu na dokumentację: być może będziesz musiał kopać głębiej, ponieważ istnieje wiele konstelacji wyszukiwania i przeskakiwania (tak jak musiałem). Może się okazać, że
prune
to twój przyjaciel, a-not -path
nie zrobi tego, czego oczekujesz.Oto cenny przykład 15 przykładów wyszukiwania, które wykluczają katalogi:
http://www.theunixschool.com/2012/07/find-command-15-examples-to-exclude.html
Aby połączyć się z początkowym pytaniem, wykluczanie w końcu zadziałało dla mnie w ten sposób:
Następnie, jeśli chcesz znaleźć jeden plik i nadal wykluczyć ścieżki, po prostu dodaj
| grep myFile.txt
.Może to również zależeć od znalezionej wersji. Widzę:
źródło
-name
pasuje tylko do nazwy pliku, a nie do całej ścieżki. Zamiast tego chcesz użyć-path
dla części, w których przycinasz katalogi, takie jakdef/incoming
.źródło
źródło
find ... -print0
w połączeniu z późniejszymxargs -0
Postępując zgodnie z tym Jak wykluczyć katalog w funkcji find. polecenie :
źródło