Ich habe die folgende Zeile in einem Skript zum Sichern und es kopiert nicht rekursiv alle Verzeichnisse, es holt die Dateien, wirft sie aber alle zusammen. Kann mir jemand sagen, was damit nicht stimmt?
find . -type f -not -executable -exec cp -ruv {} /run/media/user/32GB/prog/ \;
Antwort1
Das -exec
Argument für find führt diesen Befehl einfach für jedes zurückgegebene Element aus. Wenn Sie beispielsweise ein Verzeichnis wie folgt festgelegt haben:
>$ find .
.
./a.txt
./b.txt
./dir1
./dir1/c.txt
./dir2
./dir2/d.txt
Der -exec
Teil wird einmal für jede Zeile ausgeführt und ersetzt den Text durch {}
. In Ihrem Fall würde also jeder Eintrag rekursiv in das angegebene Verzeichnis kopiert.
cp -ruv a.txt /run/media/user/32GB/prog/
cp -ruv b.txt /run/media/user/32GB/prog/
cp -ruv dir1 /run/media/user/32GB/prog/
cp -ruv dir1/c.txt /run/media/user/32GB/prog/
etc, etc
Übrigens markieren Sie auch -not -executable
. Das macht den eigentlichen Unterschied. Verzeichnisse in Linux sind ausführbar. (Das Execute-Bit von Verzeichnissen verwaltet die Berechtigungen zum Auflisten des Verzeichnisinhalts, da Ordner nicht ausgeführt werden können.)
>$ ls -l
-rw-rw-r--. 1 user user 1583 Feb 10 13:14 a.txt
-rw-rw-r--. 1 user user 1583 Feb 10 13:14 b.txt
drwxr-xr-x. 2 user user 4096 Nov 22 2013 dir1
drwxr-xr-x. 2 user user 4096 Nov 22 2013 dir2
Also,
>$ find . -not -executable
a.txt
b.txt
dir1/c.txt
dir2/d.txt
Gibt keine Verzeichnisse zurück, sondern nur eine Liste nicht ausführbarer Dateien ( -type f
). Und kopiert, wie gesagt, cp
jede einzelne davon einzeln (da nur Verzeichnisse rekursiv kopiert werden können) nach/run/media/user/32GB/prog/
Eine mögliche Lösung besteht darin, zuerst alles zu kopieren und dann ein find
/ auszuführen.rm
>$ cp -ruv . /run/media/user/32GB/prog/
>$ find /run/media/user/32GB/prog -executable -type f -exec rm {} \;
Oder ein böses rsync
(ich liebe rsync
):
>$ find . -type f -not -executable > /tmp/filelist
>$ rsync -r --include-from=/tmp/filelist . /run/media/user/32GB/prog/
rsync kopiert das aktuelle Verzeichnis rekursiv und fügt nur die angegebenen Dateien hinzu – die nicht ausführbaren. Dadurch wird das zusätzliche Schreiben/Löschen vermieden.