Ich versuche, einen find
Befehl für alle JavaScript-Dateien auszuführen , aber wie schließe ich ein bestimmtes Verzeichnis aus?
Hier ist der find
Code, den wir verwenden.
for file in $(find . -name '*.js')
do
java -jar config/yuicompressor-2.4.2.jar --type js $file -o $file
done
find ... | while read -r file ...
. Es ist auch besser, Antworten zu akzeptieren und zu bewerten.for file in $(find .); do echo "$file"; done
. Namen mit Leerzeichen werden geteilt, was wir nicht wollen.Antworten:
Verwenden Sie den
-prune
Schalter. Wenn Sie beispielsweise dasmisc
Verzeichnis ausschließen möchten, fügen Sie-path ./misc -prune -o
Ihrem Suchbefehl einfach ein hinzu :Hier ist ein Beispiel mit mehreren Verzeichnissen:
Hier schließen wir dir1 , dir2 und dir3 aus , da es sich bei
find
Ausdrücken um eine Aktion handelt, die auf die Kriterien-path dir1 -o -path dir2 -o -path dir3
(wenn dir1 oder dir2 oder dir3 ) einwirkt , UNDed mittype -d
.Weitere Aktion ist
-o print
, einfach drucken.quelle
-print
explizit eine (oder eine andere Aktion) hinzugefügt haben-name
. In diesem Fall werden beide "Seiten"-o
gedruckt, während bei Verwendung-print
nur diese Seite gedruckt wird.Because -delete implies -depth, you cannot usefully use -prune and -delete together.
Wie gehe ich beim Löschen mit find vor, wenn ich bestimmte Verzeichnisse vom Löschen ausschließen möchte?find . -not -path "./.git*"
. Wenn Sie./dir*
anstelle von verwenden, werden sowohl./dir/*
das Verzeichnis als auch der Inhalt aus der Ausgabe entfernt.Wenn
-prune
es bei Ihnen nicht funktioniert, wird dies:Vorsichtsmaßnahme: Erfordert das Durchlaufen aller unerwünschten Verzeichnisse.
quelle
-prune
schließt das Verzeichnis selbst nicht aus, es schließt seinen Inhalt aus, was bedeutet, dass Sie eine unerwünschte Zeile in der Ausgabe mit dem ausgeschlossenen Verzeichnis erhalten..
in ändern*
. sofind -name "*.js" -not -path "*/omitme/*"
würde Dateien aus einem Verzeichnis mit dem Namen „omitme“ auf jeder Ebene der Tiefe wegzulassen.-print
explizit verwenden.Ich finde Folgendes leichter zu überlegen als andere vorgeschlagene Lösungen:
Wichtiger Hinweis: Die Pfade, nach denen Sie eingeben,
-path
müssen genau mit denen übereinstimmen,find
die ohne Ausschluss gedruckt werden. Wenn dieser Satz verwirrt, stellen Sie einfach sicher, dass Sie den gesamten Befehl wie folgt vollständig verwenden : . Siehe Anmerkung [1], wenn Sie ein besseres Verständnis wünschen.find /full/path/ -not \( -path /full/path/exclude/this -prune \) ...
Im Inneren
\(
und\)
ist ein Ausdruck, der genau übereinstimmtbuild/external
(siehe wichtigen Hinweis oben) und bei Erfolg verhindert, dass etwas weiter unten durchlaufen wird . Dies wird dann als einzelner Ausdruck mit der maskierten Klammer gruppiert und mit-not
dem Präfix versehen, wodurchfind
alles übersprungen wird, was mit diesem Ausdruck übereinstimmt.Man könnte fragen, ob durch das Hinzufügen
-not
nicht alle anderen Dateien durch-prune
erneutes Erscheinen ausgeblendet werden , und die Antwort lautet Nein. Die Art und Weise-prune
funktioniert so, dass alles, was, sobald es erreicht ist, die Dateien unter diesem Verzeichnis dauerhaft ignoriert werden.Dies kommt aus einem tatsächlichen Anwendungsfall, in dem ich yui-compressor für einige von wintersmith generierte Dateien aufrufen musste, aber andere Dateien, die so wie sie sind gesendet werden müssen, weglassen musste.
Hinweis [1] : Wenn Sie ausschließen möchten
/tmp/foo/bar
und find wie folgt ausführen,find /tmp \(...
müssen Sie angeben-path /tmp/foo/bar
. Wenn Sie andererseits find so ausführen,cd /tmp; find . \(...
müssen Sie angeben-path ./foo/bar
.quelle
find . -not \( -path ./CVS -prune \) -type f -mtime +100 -delete find: The -delete action atomatically turns on -depth, but -prune does nothing when -depth is in effect. If you want to carry on anyway, just explicitly use the -depth option.
-exec rm -rf {} \;
anstelle von verwenden-delete
.find
, ist das wirklich offensichtlich, aber es hat mich gestolpert. Wenn Sie im aktuellen Verzeichnis suchen (indem Sie.
als Suchpfad angeben oder gar keinen angeben), möchten Sie höchstwahrscheinlich, dass Ihr Muster danach-path
beginnt./
, zfind -not \( -path ./.git -prune \) -type f
. B.: .find searchdir \! \( -type d \( -path './excludedir/*' -o -path './excludedir2/*' -o -path './excludedir3/*' \) -prune \)
gefolgt von allen Bedingungen, die Ihren Anforderungen entsprechen sollten.Hier besteht eindeutig Verwirrung darüber, wie die bevorzugte Syntax zum Überspringen eines Verzeichnisses lauten soll.
GNU Stellungnahme
Auf der GNU finden Sie eine Manpage
Argumentation
-prune
stoppt denfind
Abstieg in ein Verzeichnis. Nur die Angabe-not -path
wird weiterhin in das übersprungene Verzeichnis verschoben , ist jedoch-not -path
bei jedemfind
Test jeder Datei falsch .Probleme mit
-prune
-prune
tut, was es beabsichtigt, aber es gibt immer noch einige Dinge, auf die Sie achten müssen, wenn Sie es verwenden.find
druckt das beschnittene Verzeichnis.-prune
funktioniert nur mit-print
und keine anderen Aktionen.-prune
funktioniert mit jeder Aktion außer-delete
. Warum funktioniert es nicht mit Löschen? Um-delete
zu arbeiten, muss find das Verzeichnis in der DFS-Reihenfolge durchlaufen, da-delete
zuerst die Blätter, dann die Eltern der Blätter usw. gelöscht werden. Damit die Angabe-prune
jedoch sinnvoll ist,find
muss ein Verzeichnis getroffen und der Abstieg gestoppt werden macht offensichtlich keinen Sinn mit-depth
oder-delete
auf.Performance
Ich habe einen einfachen Test der drei am besten bewerteten Antworten auf diese Frage erstellt (ersetzt
-print
durch-exec bash -c 'echo $0' {} \;
, um ein anderes Aktionsbeispiel zu zeigen). Die Ergebnisse sind untenFazit
Sowohl f10bit Syntax und Daniel C. Sobral Syntax nahm 10-25ms im Durchschnitt zu laufen. Die Syntax von GetFree , die nicht verwendet wird
-prune
, dauerte 865 ms. Ja, dies ist ein ziemlich extremes Beispiel, aber wenn Sie sich für die Laufzeit interessieren und etwas aus der Ferne intensiv tun, sollten Sie es verwenden-prune
.Hinweis Die Syntax von Daniel C. Sobral war die bessere der beiden
-prune
Syntaxen. Ich vermute jedoch stark, dass dies das Ergebnis eines Zwischenspeicherns ist, da das Umschalten der Reihenfolge, in der die beiden ausgeführt wurden, zu dem entgegengesetzten Ergebnis führte, während die Version ohne Bereinigung immer am langsamsten war.Testskript
quelle
-prune
kann ich feststellen, dass es selten einen Unterschied gibt. Denken Sie daran, dass der erste Befehlsstart von der CPU-Leistung profitiert. Der spätere Aufwärmen der CPU> Leistungsabfall führt zu einer geringfügigen Verlangsamung (ich habe den Cache vor jedem Befehl als @ ndemou-Vorschlag gelöscht)name1() name2() name3()
im obigen @ BroSlow-Testskript zu wechseln, um die Ausführungsreihenfolge zu ändern und eine visuelle Darstellung meiner Aussagen zu erhalten. Im wirklichen Leben ist es zwischen diesen beiden jedoch nicht wahrnehmbar.Dies ist der einzige, der für mich gearbeitet hat.
Suche nach "MyFile" ohne "Directory". Betonen Sie die Sterne *.
quelle
! -path '*/Directory/*'
Ihrem Befehl nacheinander mehrere hinzufügen können, um mehrere Verzeichnisse zu ignorierendocker container
einzigen Werk mitsh -c "find..."
Eine Möglichkeit wäre, alle Ergebnisse, die den Verzeichnisnamen enthalten, mit grep auszuschließen. Zum Beispiel:
quelle
-prune
) - nicht.find . -name '*.js' | grep -v excludeddir | grep -v excludedir2 | grep -v excludedir3
aber es kann einen Grep-Weg geben.egrep -v '(dir1|dir2|dir3)'
. In dieser speziellen Fallstudie ist es jedoch besser, Verzeichnisse in sichfind
selbst auszuschließen .Ich bevorzuge die
-not
Notation ... sie ist besser lesbar:quelle
find
heißt es: "Um ein Verzeichnis und die Dateien darunter zu ignorieren, verwenden Sie -prune."find . -iname '*' -and -not -path './somePath'
hindert es nicht daran, dieses Verzeichnis zu betreten.find . -iname '*' -not -path './.git/*'
find . -not -path "*/.git*"
wäre das, was du willst.Verwenden Sie die Option -prune. Also so etwas wie:
Der '-type d -name proc -prune' sucht nur nach Verzeichnissen mit dem Namen proc, die ausgeschlossen werden sollen.
Das '-o' ist ein 'ODER'-Operator.
quelle
-print
zum Ende kann jedoch die Ergebnisse verbessern.find . -type d -name .hg -prune -o -name data
ignorierte den Inhalt der (mehreren).hg
Verzeichnisse, listete jedoch die.hg
Verzeichnisse selbst auf. Mit-print
wurden nur die von mir gesuchten "Daten" -Verzeichnisse aufgelistet.-prune
funktioniert definitiv und ist die beste Antwort, da es verhindert, dass Sie in das Verzeichnis absteigen, das Sie ausschließen möchten.-not -path
Wenn das ausgeschlossene Verzeichnis weiterhin durchsucht wird, wird das Ergebnis einfach nicht gedruckt. Dies kann ein Problem sein, wenn das ausgeschlossene Verzeichnis über ein Netzwerk-Volume bereitgestellt wird oder Sie keine Berechtigungen haben.Der schwierige Teil ist, dass
find
die Reihenfolge der Argumente sehr genau ist. Wenn Sie sie also nicht genau richtig verstehen, funktioniert Ihr Befehl möglicherweise nicht. Die Reihenfolge der Argumente ist im Allgemeinen wie folgt:{path}
: Stellen Sie alle pfadbezogenen Argumente an die erste Stelle, z. -path './dir1' -prune -o
{options}
: Ich habe den größten Erfolg, wenn ich-name, -iname, etc
als letzte Option in diese Gruppe setze. Z.B-type f -iname '*.js'
{action}
: Sie möchten hinzufügen,-print
wenn Sie verwenden-prune
Hier ist ein Arbeitsbeispiel:
quelle
In diesem Format habe ich einige Pfade ausgeschlossen:
Ich habe dies verwendet, um alle Dateien zu finden, die sich nicht in ". *" - Pfaden befinden:
quelle
Der Ansatz -path -prune funktioniert auch mit Platzhaltern im Pfad. Hier ist eine find-Anweisung, die die Verzeichnisse für einen Git-Server findet, der mehrere Git-Repositorys bedient, wobei die internen Git-Verzeichnisse weggelassen werden:
quelle
So schließen Sie mehrere Verzeichnisse aus:
Fügen Sie zum Hinzufügen von Verzeichnissen Folgendes hinzu
-o -path "./dirname/*"
:Aber vielleicht sollten Sie einen regulären Ausdruck verwenden , wenn viele Verzeichnisse ausgeschlossen werden müssen.
quelle
Es gibt viele gute Antworten. Ich habe nur einige Zeit gebraucht, um zu verstehen, wofür jedes Element des Befehls gedacht war und welche Logik dahinter steckt.
find beginnt mit der Suche nach Dateien und Verzeichnissen im aktuellen Verzeichnis, daher die
find .
.Die
-o
Option steht für ein logisches ODER und trennt die beiden Teile des Befehls:Ein Verzeichnis oder eine Datei, die nicht das Verzeichnis ./misc ist, besteht den ersten Test nicht
-path ./misc
. Sie werden jedoch gegen den zweiten Ausdruck getestet. Wenn ihr Name dem Muster entspricht, werden*.txt
sie aufgrund der-print
Option gedruckt .Wenn find das Verzeichnis ./misc erreicht, erfüllt dieses Verzeichnis nur den ersten Ausdruck. Die
-prune
Option wird also darauf angewendet. Der Befehl find wird angewiesen , dieses Verzeichnis nicht zu durchsuchen. Daher werden Dateien oder Verzeichnisse in ./misc nicht einmal von find durchsucht, nicht gegen den zweiten Teil des Ausdrucks getestet und nicht gedruckt.quelle
Für eine funktionierende Lösung (getestet unter Ubuntu 12.04 (Precise Pangolin)) ...
sucht im aktuellen Ordner und in den Unterordnern nach MP3-Dateien, außer im Unterordner dir1.
Verwenden:
... um dir1 UND dir2 auszuschließen
quelle
Ein guter Trick, um das Drucken der beschnittenen Verzeichnisse zu vermeiden, ist die Verwendung
-print
(funktioniert auch für-exec
) nach der rechten Seite des-or
Nachher-prune
. Beispielsweise, ...Gibt den Pfad aller Dateien unter dem aktuellen Verzeichnis mit der Erweiterung ".j2" aus und überspringt alle versteckten Verzeichnisse. Ordentlich. Es wird jedoch auch der vollständige Pfad jedes Verzeichnisses gedruckt, das übersprungen wird, wie oben angegeben folgendes nicht, ...
denn logischerweise gibt es ein verstecktes
-and
nach dem-iname
Operator und vor dem -print. Dies bindet es-or
aufgrund der booleschen Reihenfolge der Operationen und der Assoziativität an den rechten Teil der Klausel. Aber die Dokumente sagen, dass es ein verstecktes gibt,-print
wenn es (oder einer seiner Cousins ...-print0
usw.) nicht angegeben ist. Warum ist der linke Teil des-or
Drucks nicht? Anscheinend (und das habe ich beim ersten Lesen der Manpage nicht verstanden) ist das wahr, wenn es kein-print
-oder-exec
ÜBERALL gibt. In diesem Fall wird der Druck logisch so herumgestreut, dass alles gedruckt wird. Wenn auch nur einerprint
-style Operation wird in jeder Klausel ausgedrückt, alle diese versteckten logischen verschwinden und Sie erhalten nur das, was Sie angeben. Ehrlich gesagt hätte ich es vielleicht umgekehrt bevorzugt, aber dann würde einfind
mit nur beschreibenden Operatoren anscheinend nichts tun, also denke ich, dass es so sinnvoll ist, wie es ist. Wie oben erwähnt, funktioniert dies alles-exec
auch. Im Folgenden wird eine vollständigels -la
Liste für jede Datei mit der gewünschten Erweiterung angezeigt, jedoch nicht die erste Ebene jedes versteckten Verzeichnisses.Für mich (und andere in diesem Thread) wird die
find
Syntax ziemlich schnell ziemlich barock, daher werfe ich immer Parens ein, um sicherzugehen, dass ich weiß, was an was gebunden ist. Daher erstelle ich normalerweise ein Makro für die Typfähigkeit und bilde alle Aussagen wie. ..Es ist schwer, etwas falsch zu machen, wenn man die Welt auf diese Weise in zwei Teile aufteilt. Ich hoffe, das hilft, obwohl es unwahrscheinlich ist, dass jemand die über 30-jährige Antwort liest und darüber abstimmt, aber man kann hoffen. :-)
quelle
Sie können die Prune-Option verwenden, um dies zu erreichen. Wie zum Beispiel:
Oder die inverse grep-Option "grep -v":
Detaillierte Anweisungen und Beispiele finden Sie im Linux-Befehl find. Verzeichnisse von der Suche ausschließen .
quelle
find . -type f -print -o -path "*/node_modules" -prune
entschlossen ... mit dem Platzhalter "node_modules" auf jeder Ebene zu überspringen; Bei Verwendung-print
der ersten Alternative-type f -print
wird nur dieser Teil gedruckt, sodass die Verzeichnisse "node_modules" selbst nicht aufgelistet sind. (es kann auch umgekehrt sein:find . -path "*/node_modules" -prune -o -type f -print
)./node_modules
und*/node_modules
daraus gelernt . In meinem Fall, in demnode_modules
nur das Verzeichnis vorhanden ist, in dem ich die Suche starte (und unter diesemnode_modules
Verzeichnis), kann ich verwenden,find . -type f -print -o -path "./node_modules" -prune
danode_modules
unter keinem anderen Verzeichnis ein Verzeichnis vorhanden ist.node_modules
Unterverzeichnis, aber es gab auch Unterverzeichnisse , die ihr eigenes hatten node_modules ... mit./node_modules
Streichhölzern nur das Unterverzeichnisnode_modules
unter dem aktuellen Verzeichnis.
und Pflaumen es; Verwenden von*/node_modules
Übereinstimmungen und Bereinigen des Verzeichnisses in einer beliebigen Tiefe, da*
as als Glob mit einem führenden Pfadpräfix übereinstimmt, z. B../test5/main/node_modules
nicht nur mit dem./
Präfix. Das*
ist ein Platzhalter, aber als Glob nicht als Regex.quelle
find ~/Projects -name '*.js' -\! -name 'node_modules' -prune
node_modules
find ~/Projects -path ~/Projects/node_modules -prune -o -name '*.js' -print
. Der Name dieses Pfads muss genau mit dem übereinstimmen, der gefunden wird, wenn das Verzeichnis gedruckt wird.scheint genauso zu funktionieren wie
und ist leichter zu merken IMO.
quelle
TLDR: Verstehen Sie Ihre Stammverzeichnisse und passen Sie Ihre Suche von dort aus mithilfe der
-path <excluded_path> -prune -o
Option an. Fügen Sie/
am Ende des ausgeschlossenen Pfads kein nachfolgendes Zeichen ein.Beispiel:
find / -path /mnt -prune -o -name "*libname-server-2.a*" -print
Um das effektiv zu nutzen
find
, ist es meines Erachtens unerlässlich, ein gutes Verständnis Ihrer Dateisystem-Verzeichnisstruktur zu haben. Auf meinem Heimcomputer habe ich Festplatten mit mehreren TB, wobei etwa die Hälfte dieses Inhalts mitrsnapshot
(dhrsync
) gesichert wurde . Obwohl auf einem physisch unabhängigen (doppelten) Laufwerk gesichert, wird es unter meinem Systemverzeichnis root (/
) bereitgestellt/mnt/Backups/rsnapshot_backups/
::Das
/mnt/Backups/rsnapshot_backups/
Verzeichnis belegt derzeit ~ 2,9 TB mit ~ 60 Millionen Dateien und Ordnern. Das einfache Durchlaufen dieser Inhalte braucht Zeit:Jedes Mal, wenn ich auf meiner
/
(Root-) Partition nach einer Datei suchen muss , muss ich mich mit dem Durchlaufen meiner Sicherungspartition befassen (wenn möglich vermeiden).BEISPIELE
Unter den in diesem Thread unterschiedlich vorgeschlagenen Ansätzen ( So schließen Sie ein Verzeichnis im Befehl find. Aus ) finde ich, dass die Suche mit der akzeptierten Antwort viel schneller ist - mit Einschränkungen.
Lösung 1
Angenommen, ich möchte die Systemdatei finden
libname-server-2.a
, aber meinersnapshot
Sicherungen nicht durchsuchen . Verwenden Sie den Ausschlusspfad/mnt
(dh verwenden/mnt
, nicht/mnt/
oder/mnt/Backups
oder oder ...) , um schnell eine Systemdatei zu finden :... findet diese Datei in nur wenigen Sekunden, während dies viel länger dauert (scheint alle "ausgeschlossenen" Verzeichnisse zu durchlaufen):
Lösung 2
Die andere in diesem Thread angebotene Lösung ( SO # 4210042 ) weist ebenfalls eine schlechte Leistung auf:
ZUSAMMENFASSUNG | SCHLUSSFOLGERUNGEN
Verwenden Sie den in " Lösung 1 " dargestellten Ansatz.
dh
Beachten Sie, dass
/
derfind
Befehl jedes Mal , wenn Sie das Trailing zum ausgeschlossenen Pfad hinzufügen , rekursiv (alle diese)/mnt/*
Verzeichnisse eingibt - was in meinem Fall aufgrund der/mnt/Backups/rsnapshot_backups/*
Unterverzeichnisse zusätzlich ~ 2,9 TB an zu durchsuchenden Dateien enthält! Wenn Sie kein Trailing anhängen,/
sollte die Suche fast sofort (innerhalb von Sekunden) abgeschlossen sein."Lösung 2" (
... -not -path <exclude path> ...
) scheint ebenfalls rekursiv durch die ausgeschlossenen Verzeichnisse zu suchen - keine ausgeschlossenen Übereinstimmungen zurückzugeben, aber diese Suchzeit unnötig zu verbrauchen.Suchen in diesen
rsnapshot
Backups:So finden Sie eine Datei in einem meiner stündlichen / täglichen / wöchentlichen / monatlichen
rsnapshot
Backups):Ein verschachteltes Verzeichnis ausschließen:
Hier möchte ich ein verschachteltes Verzeichnis ausschließen, z. B.
/mnt/Vancouver/projects/ie/claws/data/*
bei der Suche aus/mnt/Vancouver/projects/
:Nebenbei: Durch Hinzufügen
-print
am Ende des Befehls wird der Ausdruck des ausgeschlossenen Verzeichnisses unterdrückt:quelle
find
, sondern die Anzahl der Verzeichniseinträge , die untersucht werden müssen. Es ist also viel schlimmer, wenn Sie viele, viele kleine Dateien haben (insbesondere wenn sie alle mehrfach verknüpft sind!), Als wenn Sie nur eine Handvoll Multi-Gigabyte-Dateien haben.sudo ls -R / | wc -l
zeigt ~ 76,5 Millionen Dateien an (von denen die meisten mit Ausnahme von "nicht konfigurierten" Systemdateien gesichert werden)./mnt/Vancouver/
mitls -R | wc -l
zeigt ~ 2,35 Millionen Dateien an;/home/victoria/
enthält 0,668 Millionen Dateien.Sie können auch reguläre Ausdrücke verwenden, um einige Dateien / Verzeichnisse Ihrer Suche ein- oder auszuschließen.
Dadurch erhalten Sie nur alle js-, vue-, css- usw. Dateien, jedoch nicht alle Dateien in den Ordnern
node_modules
undvendor
.quelle
Ich habe verwendet
find
, um eine Liste von Dateien für bereitzustellenxgettext
, und wollte ein bestimmtes Verzeichnis und dessen Inhalt weglassen. Ich habe viele Permutationen von-path
kombiniert mit versucht-prune
, konnte aber das Verzeichnis, das ich haben wollte, nicht vollständig ausschließen.Obwohl ich den Inhalt des Verzeichnisses ignorieren konnte, das ich ignorieren wollte, gab ich
find
das Verzeichnis selbst als eines der Ergebnisse zurück, die dazu führtenxgettext
zu einem Absturz führte (akzeptiert keine Verzeichnisse; nur Dateien).Meine Lösung bestand darin, einfach
grep -v
das Verzeichnis zu überspringen, das ich in den Ergebnissen nicht haben wollte:Ob es dafür ein Argument gibt
find
, das zu 100% funktioniert, kann ich nicht mit Sicherheit sagen. Die Verwendunggrep
war eine schnelle und einfache Lösung nach einigen Kopfschmerzen.quelle
Keine der vorherigen Antworten ist unter Ubuntu gut. Versuche dies:
Ich habe das hier gefunden
quelle
Dies ist für mich auf einem Mac geeignet:
Es wird ausschließen
vendor
undapp/cache
dir für die Suche Namen, der mit dem Suffixphp
.quelle
Für diejenigen unter Ihnen unter älteren UNIX-Versionen, die -path oder -not nicht verwenden können
Getestet mit SunOS 5.10 Bash 3.2 und SunOS 5.11 Bash 4.4
quelle
How-to-use-Prune-Option-of-Fund-in-sh ist eine ausgezeichnete Antwort von Laurence Gonsalves , wie
-prune
funktioniert.Und hier ist die generische Lösung:
Um zu vermeiden, dass Sie
/path/to/seach/
mehrmals tippen, wickeln Sie dasfind
in einpushd .. popd
Paar.quelle
-path
Muss verwendete Syntax mit dem Namen übereinstimmen muss, der gefunden wird, wenn das Verzeichnis beispielsweise so gedruckt wirdfind . -path ./.git -prune -o -print
, oderfind $HOME/foo -path $HOME/foo/.git -prune -o -print
einige der Antworten sagen nur,-path somedir
was leider der Fall ist nicht genau genug, um nützlich zu sein.Für das, was ich brauchte, funktionierte es so,
landscape.jpg
auf allen Servern beginnend mit root zu finden und die Suche im/var
Verzeichnis auszuschließen :find / -maxdepth 1 -type d | grep -v /var | xargs -I '{}' find '{}' -name landscape.jpg
find / -maxdepth 1 -type d
listet alle d irectories in/
grep -v /var
schließt `/ var 'von der Liste ausxargs -I '{}' find '{}' -name landscape.jpg
Führen Sie einen beliebigen Befehl aus, wiefind
bei jedem Verzeichnis / Ergebnis aus der Listequelle
/
ist noch nicht ausgeschlossen. Möglicherweise benötigen Siesed 1d
.Die folgenden Befehle funktionieren:
Wenn Sie ein Problem mit der Suche haben, verwenden Sie die
-D tree
Option, um die Informationen zur Ausdrucksanalyse anzuzeigen.Oder die
-D all
, um alle Ausführungsinformationen anzuzeigen.quelle
Ich fand den Funktionsnamen in C-Quellendateien ausschließen * .o und ausschließen * .swp und ausschließen (keine reguläre Datei) und ausschließen dir Ausgabe mit diesem Befehl:
quelle
Verwenden Sie die
exec
Aktion besser als diefor
Schleife:Das
exec ... '{}' ... '{}' \;
wird einmal für jede übereinstimmende Datei ausgeführt, wobei die geschweiften Klammern'{}'
durch den aktuellen Dateinamen ersetzt werden.Beachten Sie, dass die geschweiften Klammern in einfache Anführungszeichen gesetzt sind, um sie vor der Interpretation als Shell-Skript-Interpunktion * zu schützen .
Anmerkungen
* Aus dem Abschnitt BEISPIELE der
find (GNU findutils) 4.4.2
Manpagequelle
exec
Aktion oft und finde sie sehr nützlich. Normalerweise füge ich Anführungszeichen hinzu,{}
falls in den Dateipfaden Leerzeichen vorhanden sind"{}"
.{}
funktioniert für Dateien mit Leerzeichen im Namen) und einem Blick in die Manpages scheint das Anführen nur zu vermeiden Sie werden als Interpunktion für Shell-Skripte falsch interpretiert. In diesem Fall würden Sie einfache Anführungszeichen verwenden:'{}'
cp
odermv
oder zu machenrm
. Ich werde es überprüfenIch habe den obigen Befehl ausprobiert, aber keiner von denen, die "-prune" verwenden, funktioniert für mich. Schließlich habe ich dies mit dem folgenden Befehl ausprobiert:
quelle