Rekursives Sichern ist kein Kopieren von Verzeichnissen

Rekursives Sichern ist kein Kopieren von Verzeichnissen

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 -execArgument 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 -execTeil 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, cpjede 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.

verwandte Informationen