Znajdź pliki w systemie Linux i wyklucz określone katalogi

14

Mam znalezisko wyglądające tak:

rm -f crush-all.js
find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | while read line
do
   cat "$line" >> crush-all.js
   echo >> crush-all.js
done

Chciałbym dodać, aby wykluczyć katalog o nazwie „test” w znalezieniu, ale wydaje mi się, że nie mogę wymyślić, jak w jakiś sposób dodać „typ d”. Jak mogłem to zrobić?

Dzięki!

Asken
źródło

Odpowiedzi:

22

Możesz użyć -pathopcji, aby znaleźć i połączyć go z -notoperatorem.

find . ! -path "*/test/*" -type f -name "*.js" ! -name "*-min-*" ! -name "*console*"

Proszę zwrócić uwagę na dwie rzeczy

  • -path musi przyjść jako pierwszy argument
  • wzorzec pasuje do całej nazwy pliku, więc -path testnigdy nie będzie pasował do niczego

Nawiasem mówiąc, nie jestem pewien, dlaczego używasz nawiasów, to nie robi różnicy. Jest używany tylko w celu pierwszeństwa, w konstrukcjach takich jak ! \( -name '*bla*' -name '*foo*' \)(to znaczy nie znajduj rzeczy, które mają jedno blai drugie foo).

Dalsze udoskonalenie: nie musisz korzystać z pętli bash, możesz po prostu to zrobić

find . ... -exec cat {} \; -exec echo \;

gdzie ... są inne argumenty find.

styczeń
źródło
2
find / -path ./test -prune -o ...

Zmień nazwę, ./testaby dopasować lokalizację twojego katalogu testowego.

Charles Clavadetscher
źródło
2
W takim przypadku nie zapomnij dodać akcji -print (ponieważ -print nie jest domyślną akcją) po opcji -o
Bill Zhao
1

Możesz spróbować z grep w ten sposób (folder tutaj nazywa się test_folder):

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "/path/to/test_folder/" | while read line

lub jeśli twoje znalezisko zwraca ścieżkę względną:

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "./relative_path/to/test_folder/" | while read line

lub jeśli chcesz wszystkie foldery o tej samej nazwie, ale o innej ścieżce

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "/test_folder/" | while read line

Z poważaniem,

Antoine Rodriguez
źródło
1

Aby rozwinąć to, co myślę, że @CharlesClavadetscherchodziło o jego odpowiedź. Jeśli pominiesz ścieżkę -not -path ... find, kontynuujesz jej schodzenie. Zamiast tego użycie -prunespowoduje, że nie będzie zjeżdżał dalej na pominiętą ścieżkę, dzięki czemu będzie szybszy. Możesz więc zrobić coś takiego

find . -path '*test/*' -prune -o -type f -name "*.js" ! -name "*-min*" ! -name "*console*" -print

źródło
0

Kiedy szukam pliku, używam słowa „nie pełna nazwa”. -name sprawdza rzeczywistą nazwę pliku, ale -wholename sprawdza pełną ścieżkę. Dodając więc ignoruj ​​test do powyższego pytania:

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) ! -wholename "*test*"
Andrew Lorien
źródło