Finden Sie Dateien unter Linux und schließen Sie bestimmte Verzeichnisse aus

14

Ich habe einen Fund, der so aussieht:

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

Ich möchte hinzufügen, um ein Verzeichnis mit dem Namen "test" in der Suche auszuschließen, aber ich kann nicht herausfinden, wie man "-type d" irgendwie hinzufügt. Wie habe ich das gemacht?

Vielen Dank!

Asken
quelle

Antworten:

22

Sie können die -pathOption verwenden, um sie zu finden und mit dem -notOperator zu kombinieren .

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

Bitte beachten Sie zwei Dinge

  • -path muss als erstes argument kommen
  • Das Muster stimmt mit dem gesamten Dateinamen -path testüberein und wird daher niemals mit etwas übereinstimmen

Übrigens bin ich mir nicht sicher, warum Sie Klammern verwenden, es macht keinen Unterschied. Es wird nur vorrangig verwendet, für Konstrukte wie ! \( -name '*bla*' -name '*foo*' \)(also keine Dinge finden, die beides blaund haben foo).

Eine weitere Verfeinerung: Sie müssen nicht die Bash-Schleife verwenden, sondern können dies einfach tun

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

wo ... sind die anderen Argumente dafür find.

Januar
quelle
2
find / -path ./test -prune -o ...

Benennen Sie ./testum, um den Speicherort Ihres Testverzeichnisses anzupassen .

Charles Clavadetscher
quelle
2
Vergessen Sie in diesem Fall nicht die Aktion add -print (da -print keine Standardaktion ist) nach der Option -o
Bill Zhao,
1

Du kannst es mit grep so versuchen (der Ordner hier heißt test_folder):

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

oder wenn Ihre Suche einen relativen Pfad zurückgibt:

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

oder wenn Sie möchten, dass alle Ordner den gleichen Namen, aber einen anderen Pfad haben

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

Freundliche Grüße,

Antoine Rodriguez
quelle
1

Zu erweitern, was ich @CharlesClavadetschermit seiner Antwort vorhatte. Wenn Sie einen Pfad mit weglassen, -not -path ... findwird der Pfad weiter absteigend fortgesetzt. Stattdessen verhindert using -prune, dass es weiter in den ausgelassenen Pfad absteigt, wodurch es schneller wird. So kann man sowas machen

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

quelle
0

Ich verwende "nicht ganzer Name", wenn ich nur nach einer Datei suche. -name prüft den aktuellen Dateinamen, -wholename prüft den vollständigen Pfad. Fügen Sie also der obigen Frage ein Ignorieren zum Testen hinzu:

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) ! -wholename "*test*"
Andrew Lorien
quelle