2011-04-20 10:24:10 +0000 2011-04-20 10:24:10 +0000
79
79

Dateien und Ordner unter Linux rekursiv verschieben

Überlegen Sie:

ls -al ../public-back
drwxrwxr-x 4 apache apache 4096 Apr 19 03:32 templates

ls -al ../public-back/templates

drwxrwxr-x 2 apache apache 4096 Apr 19 03:33 content
drwxrwxr-x 2 apache apache 20480 Apr 20 06:14 images
drwxrwxr-x 2 apache apache 4096 Apr 19 03:35 video

ls -al /public

drwxrwxr-x 4 apache apache 4096 Apr 20 09:49 templates

ls -al /public/templates

drwxrwxr-x 2 apache apache 4096 Apr 20 09:50 content
drwxrwxr-x 2 apache apache 4096 Apr 20 09:50 images
drwxrwxr-x 2 apache apache 4096 Apr 20 09:50 video

Wie verschiebe ich den Inhalt von /public-back/templates rekursiv mit Berechtigungen nach /public/templates?

Antworten (5)

97
97
97
2011-04-20 14:10:36 +0000

Wenn ich die Frage nicht missverstanden habe, würde dies funktionieren:

mv /public-back/templates/* /public/templates

Außerdem wird beim Hinzufügen von -i gefragt, bevor etwas überschrieben wird, es sei denn, Sie haben eine riesige Liste von Dateien, was bei der Verwendung von Platzhaltern wie * eine gewisse Sicherheit bietet.

10
10
10
2011-04-20 14:24:07 +0000

Die Man Page für cp lautet:

-p same as --preserve=mode,ownership,timestamps
-r same as --recursive=copy directories recursively

Try;

cp -rp /public-back/templates/* /public/templates/
5
5
5
2016-02-17 07:43:21 +0000

Beim Verschieben von Objekten von meinem USB-Stick auf mein OSMC-System habe ich folgendes sehr nützlich gefunden:

find /media/Pi\ Hard\ 16GB/ -name '*' -exec mv -v {} /media/External\ HDD/Videos/ \;

Erklärung zur Funktionsweise weiter unten.

Übrigens: Vergessen Sie nicht, einen Backslash vor Leerzeichen in den Namen der Quell- oder Zielverzeichnisse einzufügen (siehe oben).

find finds all files and folders in the destination path.

/media/Pi Hard 16GB/ is the path searched. Escape special char such as spaces.

-name '*' filters on names. If you do not escape or quote this then 
          the shell will expand it before find sees it.

-exec Executes a command, in our case mv

-v Verbose, so you can see what's happening (optional)

{} is replaced by the name of the found object.

Effektiv finden Sie alle Dateien und alle Ordner und verschieben sie nacheinander (oder wenn ein Verzeichnis zuerst gefunden wird, verschieben Sie dieses Verzeichnis und den Inhalt darin). Dies startet für jede Verschiebung einen neuen Prozess und ist sehr ineffizient. Verwenden Sie dies nur, wenn die regulären Befehle fehlschlagen.

2
2
2
2017-09-06 07:05:14 +0000
cp -a --link ../public-back/* /public/. && rm -rf ../public-back

Erstellen Sie also harte Links im Zielverzeichnis und entfernen Sie das Quellverzeichnis. ‘mv’ wird in Ihrem Fall einfach nicht funktionieren und funktioniert im Allgemeinen nur, wenn Quellverzeichnis und dest keine gemeinsamen Unterbäume haben.

Beachten Sie, dass ich davon ausgehe, dass das Wort ‘move’ in der Frage bedeutet, dass das Quellverzeichnis nach der Operation weg sein sollte.

2
2
2
2015-10-20 15:24:37 +0000

mv scheint dies nicht zu tun. Aber Sie können diesen kleinen Trick anwenden, funktioniert wie ein Zauber:

tar cf - . |(cd /targetdir; tar xvf -)

und bewahrt die Berechtigungen und alles.

Hinweis: nichts von dem oben Gesagten hat bei mir funktioniert, deshalb diese Umgehung.