Déplacer des fichiers et des dossiers de manière récursive sous Linux


75

Considérer:

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

Comment déplacer le contenu de /public-back/templatesmanière récursive avec des autorisations dans /public/templates?


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

mv -R ../public-back/templates/* public/templates/Je voterais quand même pour poser la question.

2
mv: option non valide - R @Vladislav Zorov

3
j'ai fait cp -a ../public-back/templates/ public /

Réponses:


92

À moins que je ne comprenne mal la question, cela fonctionnerait:

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

De plus, à moins que vous ne disposiez d'une longue liste de fichiers, ajouter -idemandera avant d'écraser quoi que ce soit, ce qui ajoute une certaine sécurité lors de l'utilisation de caractères génériques tels que *.


14
Cela ne déplace pas les fichiers cachés.
Arda

2
Reportez- vous à askubuntu.com/a/259386/358964 pour la configuration de dotglob afin que les fichiers cachés soient également déplacés.
mkobit

3
Remarque: Cela ne remplacera pas les fichiers des sous-répertoires. Vous recevrez un Directory not emptymessage.
Armstrongest

Il semble que cela aplati la hiérarchie des répertoires. N'a pas conservé les dossiers dans le dossier d'origine pour moi. Tous les fichiers se sont retrouvés dans le même dossier, plutôt que de déplacer littéralement le dossier d'origine avec la même structure.
Robert Noack

Cette solution fonctionne, mais si vous voyez cette erreur: il mv: target '/public/templates' is not a directorysuffit de créer le dossier de destination manuellement: mkdir /public/templates.
Ali Shabdar

8

La page de manuel de cp indique:

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

Essayer;

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

13
mvest pour le mouvement , tandis que cpest pour la copie - une distinction sémantique / étymologique.
Marius Butuc

cpest beaucoup plus lent que mv. cpoblige l'ordinateur à tout copier du disque vers la RAM, puis à l'écrire à nouveau sur le disque, ce qui peut prendre beaucoup de temps en fonction de la taille des fichiers. Cependant, mvcela se produit toujours instantanément, car seuls les liens doivent être réécrits.
Tjespe

4

Lors du déplacement d’éléments de ma clé USB vers mon système OSMC, j’ai trouvé les informations suivantes très utiles:

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

Explication sur la façon dont cela fonctionne ci-dessous.

Au fait, n'oubliez pas d'ajouter une barre oblique inverse avant les espaces dans les noms de répertoire source ou de destination (voir ci-dessus).

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.

Effectivement, vous recherchez tous les fichiers et tous les dossiers et vous les déplacez un par un (ou, si un répertoire est trouvé en premier, vous déplacez ce répertoire et son contenu). Cela lance un nouveau processus pour chaque déménagement et est très inefficace. Utilisez-le uniquement lorsque les commandes régulières échouent.


2

MV ne semble pas faire cela. Mais vous pouvez utiliser ce petit truc, fonctionne comme un charme:

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

et préserve les autorisations et tous.

Remarque: aucune des solutions ci-dessus n'a fonctionné pour moi, c'est pourquoi cette solution de contournement.


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

Créez donc des liens physiques dans le répertoire de destination et supprimez le répertoire source. 'mv' ne fonctionnera tout simplement pas dans votre cas, et ne fonctionne en général que lorsque les répertoires source et dest n'ont pas de sous-arbres communs.

Notez que je suppose que le mot "déplacer" dans la question signifie que le répertoire source devrait être parti après l'opération.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.