Erläutern Sie die Optionen -path und -prune von find


11

Ich habe ein einfaches Skript, von dem ich am meisten verstehe. Es ist der Befehl find, 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 ? Es ist ärgerlich, solch spezifische und relevante Dokumentationen 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 herausfinden sollte.

-Pfadmuster

Der Dateiname stimmt mit dem Muster des Shell-Musters überein. Die Metazeichen behandeln / oder nicht . speziell; so zum Beispiel finden. -path "./sr*sc" gibt einen Eintrag für ein Verzeichnis mit dem Namen ./src/misc aus (falls vorhanden). Verwenden Sie -prune, um einen gesamten Verzeichnisbaum zu ignorieren, anstatt jede Datei im Baum zu überprüfen. Gehen Sie folgendermaßen vor, um das Verzeichnis src / emacs und alle Dateien und Verzeichnisse darunter zu überspringen und die Namen der anderen gefundenen Dateien auszudrucken:

find . -path ./src/emacs -prune -o -print

Aus dem Findutils-Handbuch

- 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. Dies bedeutet, dass {} auf einen relativen Pfad erweitert wird, der mit dem Namen eines der Startverzeichnisse beginnt und nicht nur mit dem Basisnamen der übereinstimmenden Datei.

Während einige Implementierungen von find das {} nur dort ersetzen, wo es in einem Argument für sich allein erscheint , ersetzt GNU find {}, wo immer es erscheint.

Und

So vergleichen Sie beispielsweise jede C-Header-Datei im oder unter dem aktuellen Verzeichnis mit der Datei / tmp / master:

      find . -name '*.h' -execdir diff -u '{}' /tmp/master ';'

Mögliches Duplikat von find:
prune

Ich denke, wenn überhaupt, handelt es sich um ein Duplikat des erklärten Suchpfads , auch wenn die Antwort bei find: prune den angegebenen Pfad nicht ignoriert und eine Antwort hat, die auf diese Frage zuzutreffen scheint. Vielleicht sind die Antworten auf der Suche nach dem Pfad für jemanden, der mehr Erfahrung mit Skripten hat, sinnvoll, aber sie helfen mir nicht. Die hier vorliegenden Antworten sind für mich bisher sinnvoller, obwohl ich gerade erst anfange, sie zu untersuchen.
Flerb

Antworten:


23

-pathfunktioniert genau wie -name, wendet das Muster jedoch auf den gesamten Pfadnamen der untersuchten Datei an und nicht auf die letzte Komponente.

-prune verbietet das Absteigen unter die gefundene Datei, falls es sich um ein Verzeichnis handelt.

Alles zusammen, der Befehl

find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;
  1. Beginnt mit der Suche nach Dateien in $HOME.
  2. Wenn eine passende Datei gefunden wird $HOME/$dir_name, wird sie nicht darunter angezeigt ("beschneidet" das Unterverzeichnis).
  3. Andernfalls ( -o), wenn eine passende Datei gefunden wird, wird diese *$file_suffixkopiert $HOME/$dir_name/.

Die Idee scheint darin zu bestehen, einige Inhalte $HOMEin einem Unterverzeichnis von zu sichern $HOME. Die Teile mit -prunesind offensichtlich notwendig, um Backups von Backups zu vermeiden ...


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 absteigen wird (da die Bereinigungsaktion als wahr ausgewertet wird und oder nicht genommen werden), nach Dateien suchen, die mit $ file_suffix enden. Sobald es eine findet, führt es cp "found_file.sh" in $ HOME / $ dir_name aus? 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.
Flerb

Ihr Verständnis ist fast richtig. -pathfunktioniert genauso wie -name: es wählt Dateien aus. Der Unterschied besteht darin, dass -nameein Muster mit dem Dateinamen -pathübereinstimmt , während ein Muster mit dem vollständigen Pfadnamen übereinstimmt. findsteigt immer in Unterverzeichnisse ab, sofern nicht durch -maxdepthoder -pruneusw. verhindert
AlexP

Oh! -path wird auf $ HOME / $ dir_name -prune angewendet. Dann ist es die Reihenfolge der Befehle, die mich durcheinander gebracht hat, und -path ist für den Befehl prune erforderlich, da er mit dem vollständigen Pfad des beschnittenen Verzeichnisses übereinstimmen muss.
Flerb

@Darren Ich bin mir nicht sicher, ob das ganz richtig ist. -path $HOME/$dir_nameist eine Aktion. Es ist ein Test, der prüft, ob der Pfad der aktuell untersuchten Datei mit dem übereinstimmt $HOME/$dir_name. -pruneist eine separate Aktion. Ich denke, der erste Satz Ihres ersten Kommentars spiegelt genau wider, wie das funktioniert.
David Z

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
flerb

4

Es ist Teil des Befehls find, der Anweisung -exec.

Sie können mit der vom findBefehl gefundenen Datei / Verzeichnis interagieren .

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

Zum Verständnis -path <some_path>siehe `find -path` erklärt

Weitere Informationen -prunefinden Sie unter /programming/1489277/how-to-use-prune-option-of-find-in-sh

-obedeutet ODER, also -path <some_path>ODER-name *$file_suffix

-exec bedeutet, den Befehl auszuführen.

cp {} $HOME/$dir_name/ Kopieren Sie alle Dateien, die mit übereinstimmen $HOME/$dir_name/

\;bedeutet, den -execBefehl zu beenden

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.