web-dev-qa-db-fra.com

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

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/templates de manière récursive avec des autorisations dans /public/templates?

68
siliconpi

À 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 -i vous demandera avant d'écraser quoi que ce soit, ce qui ajoute une certaine sécurité lorsque vous utilisez des caractères génériques comme *.

85
KennyPeanuts

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/
8
Himalay

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.

3
Pi Hard

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.

2
svye
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.

0
Boudewijn