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 ';'