Ich habe ein einfaches Skript, von dem ich die meisten verstehe. Es ist der Suchbefehl, der unklar ist. Ich habe viel Dokumentation, aber es dient nicht dazu, es viel klarer zu machen. Mein Gedanke ist, dass es wie eine for-Schleife funktioniert, die aktuell gefundene Datei gegen {} ausgetauscht und nach $ HOME / $ dir_name kopiert wird, aber wie funktioniert die Suche mit -path und -prune -o arbeiten? Es ist ärgerlich, solch spezifische und relevante Dokumentation zu haben und immer noch nicht zu wissen, was los ist.
#!/bin/bash # The files will be search on from the user"s home # directory and can only be backed up to a directory # within $HOME read -p "Which file types do you want to backup " file_suffix read -p "Which directory do you want to backup to " dir_name # The next lines creates the directory if it does not exist test -d $HOME/$dir_name || mkdir -m 700 $HOME/$dir_name # The find command will copy files that match the # search criteria ie .sh . The -path, -prune and -o # options are to exclude the backdirectory from the # backup. find $HOME -path $HOME/$dir_name -prune -o \ -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \; exit 0
Dies ist nur die Dokumentation, von der ich weiß, dass ich sie sollte Sie können dies anhand von herausfinden.
-Pfadmuster
Dateiname stimmt mit Shell-Muster überein. Die Metazeichen behandeln / oder . nicht speziell. so zum Beispiel finden. -path „./sr*sc“ druckt einen Eintrag für ein Verzeichnis mit dem Namen ./src/misc (falls vorhanden). Verwenden Sie -prune, um einen gesamten Verzeichnisbaum zu ignorieren, anstatt jede Datei im Baum zu überprüfen. Um beispielsweise das Verzeichnis src / emacs und alle Dateien und Verzeichnisse darunter zu überspringen und die Namen der anderen gefundenen Dateien auszudrucken, gehen Sie folgendermaßen vor:
find . -path ./src/emacs -prune -o -print
– Aktion: -exec Befehl; Diese unsichere Variante der Aktion -execdir wird von POSIX angegeben. Der Hauptunterschied besteht darin, dass der Befehl in dem Verzeichnis ausgeführt wird, aus dem find aufgerufen wurde, was bedeutet, dass {} auf einen relativen Pfad erweitert wird, der mit dem Namen eines der Pfade beginnt Startverzeichnisse und nicht nur der Basisname der übereinstimmenden Datei.
Während einige Implementierungen von find das {} nur dort ersetzen, wo es für sich allein angezeigt wird In einem Argument ersetzt GNU find {} , wo immer es erscheint.
Und
Um beispielsweise jede C-Header-Datei im oder unter dem aktuellen Verzeichnis mit der Datei / tmp / master zu vergleichen:
find . -name "*.h" -execdir diff -u "{}" /tmp/master ";"
Kommentare
- Mögliches Duplikat von find: prune ignoriert den angegebenen Pfad nicht
- Ich denke, wenn überhaupt, ‚ ist ein Duplikat des find-path erklärt auch wenn die Antwort bei find: prune das angegebene p nicht ignoriert ath hat eine Antwort, die auf diese Frage zuzutreffen scheint. Vielleicht sind die gefundenen Pfad-erklärten Antworten für jemanden, der mehr Erfahrung mit Skripten hat, sinnvoll, aber er hilft mir nicht, ‚. Die hier vorliegenden Antworten sind für mich bisher sinnvoller, obwohl ich ‚ gerade erst anfange, sie zu untersuchen.
Antwort
-path
funktioniert genau wie -name
, wendet jedoch das Muster auf das an Der gesamte Pfadname der zu untersuchenden Datei anstelle der letzten Komponente.
-prune
verbietet das Absteigen unter die gefundene Datei, falls es sich um ein Verzeichnis handelt.
Der Befehl
find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;
- beginnt mit der Suche nach Dateien in
$HOME
. - Wenn eine Datei gefunden wird, die mit
$HOME/$dir_name
übereinstimmt, wird sie nicht darunter angezeigt („beschneidet“ das Unterverzeichnis). - Andernfalls (
-o
) Wenn eine Datei gefunden wird, die mit*$file_suffix
übereinstimmt, wird sie in$HOME/$dir_name/
kopiert.
Die Idee scheint darin zu bestehen, einige Inhalte von $HOME
in einem Unterverzeichnis zu sichern Geschichte von $HOME
. Die Teile mit -prune
sind offensichtlich erforderlich, um Backups von Backups zu vermeiden …
Kommentare
- Wenn ich dann verstehe: find durchläuft jedes Verzeichnis in $ HOME, in das es Berechtigungen hat, mit Ausnahme von $ HOME / $ dir_name, in das es nicht absteigt (da die Bereinigungsaktion als true und the ausgewertet wird oder wird nicht genommen) und sucht nach Dateien, die mit $ file_suffix enden. Sobald eine gefunden wird, wird cp “ found_file.sh “ in $ HOME / $ dir_name ausgeführt. Außerdem ermöglicht -path einen Pfad zu einer Datei und ist nützlich, wenn Sie möchten, dass find in Verzeichnisse absteigt und nicht nur im aktuellen Verzeichnis arbeitet?
- Ihr Verständnis ist fast richtig.
-path
funktioniert genauso wie-name
: Es werden Dateien ausgewählt. Der Unterschied besteht darin, dass-name
ein Muster mit dem Dateinamen übereinstimmt, während-path
ein Muster mit dem vollständigen Pfadnamen übereinstimmt.find
steigt immer in Unterverzeichnisse ab, es sei denn, dies wird durch-maxdepth
oder-prune
usw. - Oh!-path wird auf $ HOME / $ dir_name -prune angewendet, dann ‚ ist die Reihenfolge der Befehle, die mich durcheinander gebracht haben, und -path ist für den Befehl prune erforderlich, weil dies der Fall ist muss mit dem vollständigen Pfad des beschnittenen Verzeichnisses übereinstimmen.
- @Darren Ich ‚ bin nicht sicher, ob das ‚ ist s ziemlich genau.
-path $HOME/$dir_name
ist eine Aktion. Es ist ein Test, der prüft, ob der Pfad der aktuell untersuchten Datei mit$HOME/$dir_name
übereinstimmt.-prune
ist eine separate Aktion. Ich denke, der erste Satz Ihres ersten Kommentars spiegelt genau wider, wie das funktioniert. - Würde es etwas fehlen, um es als Pfeife zu sehen? Ich habe -prune gegen -print getauscht und denke, der Fluss ist jetzt klar: find $ HOME | -path $ HOME / $ dir_name | -print
Antwort
Es ist Teil des Befehls find, der Anweisung -exec.
Hiermit können Sie mit der Datei / dem Verzeichnis interagieren, die bzw. das mit dem Befehl find
gefunden wurde.
find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;
find $HOME
bedeutet, Dateien / Verzeichnisse in $ HOME zu finden.
Um -path <some_path>
zu verstehen, siehe `find -path` erklärt
Um -prune
zu verstehen, siehe https://stackoverflow.com/questions/1489277/how-to-use-prune-option-of-find-in-sh
-o
bedeutet ODER, also -path <some_path>
ODER -name *$file_suffix
-exec
bedeutet, den Befehl auszuführen.
cp {} $HOME/$dir_name/
kopiert alle Dateien, die mit $HOME/$dir_name/
\;
übereinstimmen Beenden Sie den Befehl -exec