Verschieben Sie Dateien und Ordner unter Linux rekursiv


72

Erwägen:

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/templatesrekursiv mit Berechtigungen in /public/templates?


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

mv -R ../public-back/templates/* public/templates/Ich würde immer noch dafür stimmen, die Frage zu verschieben.

2
mv: ungültige Option - R @Vladislav Zorov

3
Ich habe cp -a ../public-back/templates/ public /

Antworten:


88

Wenn ich die Frage nicht falsch verstehe, würde dies funktionieren:

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

-iWenn Sie keine große Liste von Dateien haben, werden Sie beim Hinzufügen gefragt, bevor etwas überschrieben wird. Dies erhöht die Sicherheit bei der Verwendung von Platzhaltern wie *.


14
Dies verschiebt keine versteckten Dateien.
Arda

2
Unter askubuntu.com/a/259386/358964 erfahren Sie , wie Sie dotglob so einstellen, dass auch versteckte Dateien verschoben werden.
Mkobit

3
Hinweis: Dadurch werden keine Dateien in Unterverzeichnissen überschrieben. Sie erhalten eine Directory not emptyNachricht.
Armstrongest

Scheint, dass es die Verzeichnishierarchie abgeflacht hat. Ordner im ursprünglichen Ordner wurden für mich nicht beibehalten. Alle Dateien endeten in demselben Ordner, anstatt den ursprünglichen Ordner mit derselben Struktur buchstäblich zu verschieben.
Robert Noack

Diese Lösung funktioniert, aber wenn Sie diesen Fehler sehen: mv: target '/public/templates' is not a directorynur den Zielordner manuell erstellen: mkdir /public/templates.
Ali Shabdar

8

Die Manpage für cp lautet:

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

Versuchen;

cp -rp /public-back/templates/* /public/templates/

12
mvist für den Zug , während cpfür die Kopie ist - eine semantische / etymologische Unterscheidung.
Marius Butuc

cpist viel langsamer als mv. cpzwingt den Computer, alles von der Festplatte in den Arbeitsspeicher zu kopieren und es dann erneut auf die Festplatte zu schreiben. Dies kann abhängig von der Größe der Dateien einige Zeit in Anspruch nehmen. Dies mvgeschieht jedoch immer sofort, da nur die Links neu geschrieben werden müssen.
7.

4

Beim Verschieben von Objekten von meinem USB-Stick auf mein OSMC-System habe ich Folgendes als sehr nützlich empfunden:

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

Erklärung, wie es funktioniert, weiter unten.

Übrigens: Vergessen Sie nicht, einen Backslash vor Leerzeichen in den Quell- oder Zielverzeichnisnamen 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.

Tatsächlich suchen Sie alle Dateien und Ordner und verschieben sie nacheinander (oder wenn zuerst ein Verzeichnis gefunden wird, verschieben Sie dieses Verzeichnis und den Inhalt darin). Dies startet für jeden Zug einen neuen Prozess und ist sehr ineffizient. Verwenden Sie diese Option nur, wenn die regulären Befehle fehlschlagen.


2

mv scheint das nicht zu tun. Aber Sie können diesen kleinen Trick benutzen, der wie ein Zauber wirkt:

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

und bewahrt Berechtigungen und alle.

Hinweis: Keine der oben genannten Lösungen hat bei mir funktioniert. Aus diesem Grund wurde diese Problemumgehung durchgeführt.


0
cp -a --link ../public-back/* /public/.  &&  rm -rf ../public-back

Erstellen Sie also feste Links im Zielverzeichnis und entfernen Sie das Quellverzeichnis. 'mv' funktioniert in Ihrem Fall einfach nicht und im Allgemeinen nur, wenn source dir 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.

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.