125 votes

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

Pensez-y :

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 puis-je déplacer le contenu de /public-back/templates récursivement avec des permissions dans /public/templates ?

3voto

Boudewijn Points 31
cp -a --link ../public-back/* /public/.  &&  rm -rf ../public-back

Créez donc des liens durs 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 le répertoire source et le répertoire de destination 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 doit disparaître après l'opération.

1voto

antichris Points 1118

Aucune des réponses proposées dans ce fil de discussion ne correspond à mon cas d'utilisation. Shell Shell .

Cette fonction est au cœur du dispositif :

recurse() {
    if [ ! -d "$1" ] || [ ! -e "$2" ]; then
        mv -u "$1" "$2" || exit
        return
    fi
    for entry in "$1/"* "$1/."[!.]* "$1/.."?*; do
        if [ -e "$entry" ]; then
            recurse "$entry" "$2/${entry##"$1/"}"
        fi
    done
}

que vous pourriez invoquer comme suit (pour le cas d'utilisation du PO) :

recurse /public-back/templates /public/templates

Si la source est un fichier ou un répertoire pour lequel la destination n'existe pas encore, elle le déplace simplement avec la commande mv -u . Si la source est un répertoire pour lequel la destination existe déjà, il itère à travers son contenu et effectue récursivement la même vérification suivie de move|recurse avec chacun de ses membres.

J'ai utilisé -u parce que j'avais seulement besoin que les anciens fichiers soient rafraîchis et que les nouveaux fichiers restent intacts, mais vous pouvez le remplacer par -f pour un déménagement inconditionnel ou -i pour une version interactive. Ou ne rien changer et simplement rm -rf votre source après que le script ait fini de faire bouger les choses.

[Une reprise légèrement modifiée de Défaut du serveur ]

0voto

Victoria Stuart Points 435

Comme indiqué ci-dessus, sur le même système de fichiers mv est plus rapide que cp . Par exemple, la commande suivante préserve les horodatages et les propriétaires, et déplace récursivement les répertoires et les fichiers, y compris les fichiers et répertoires cachés.

Conditions initiales :

  • note propriété de dir02/* es root:victoria

    [victoria@victoria test]$ tree -La 5 -F . hourly.0/ .dir01/ dir01/    .dir02/    dir02/       .dir03/       dir03/          .file03          file03       .file02       file02    .file01    file01 .file00 file00

    7 directories, 8 files

    [victoria@victoria test]$ ls -laR .: total 12 drwxr-xr-x 3 victoria victoria 4096 Apr 27 10:04 . drwxrwxr-x 4 victoria victoria 4096 Apr 27 09:19 .. drwxr-xr-x 4 victoria victoria 4096 Apr 27 09:45 hourly.0

    ./hourly.0: total 16 drwxr-xr-x 4 victoria victoria 4096 Apr 27 09:45 . drwxr-xr-x 3 victoria victoria 4096 Apr 27 10:04 .. drwxr-xr-x 2 victoria victoria 4096 Apr 27 09:44 .dir01 drwxr-xr-x 4 victoria victoria 4096 Apr 27 09:45 dir01 -rw-r--r-- 1 victoria victoria 0 Apr 27 09:17 .file00 -rw-r--r-- 1 victoria victoria 0 Apr 27 09:17 file00

    ./hourly.0/.dir01: total 8 drwxr-xr-x 2 victoria victoria 4096 Apr 27 09:44 . drwxr-xr-x 4 victoria victoria 4096 Apr 27 09:45 ..

    ./hourly.0/dir01: total 16 drwxr-xr-x 4 victoria victoria 4096 Apr 27 09:45 . drwxr-xr-x 4 victoria victoria 4096 Apr 27 09:45 .. drwxr-xr-x 2 victoria victoria 4096 Apr 27 09:44 .dir02 drwxr-xr-x 4 root victoria 4096 Apr 27 09:45 dir02 -rw-r--r-- 1 victoria victoria 0 Apr 27 09:17 .file01 -rw-r--r-- 1 victoria victoria 0 Apr 27 09:17 file01

    ./hourly.0/dir01/.dir02: total 8 drwxr-xr-x 2 victoria victoria 4096 Apr 27 09:44 . drwxr-xr-x 4 victoria victoria 4096 Apr 27 09:45 ..

    ./hourly.0/dir01/dir02: total 16 drwxr-xr-x 4 root victoria 4096 Apr 27 09:45 . drwxr-xr-x 4 victoria victoria 4096 Apr 27 09:45 .. drwxr-xr-x 2 root victoria 4096 Apr 27 09:44 .dir03 drwxr-xr-x 2 root victoria 4096 Apr 27 09:45 dir03 -rw-r--r-- 1 root victoria 0 Apr 27 09:17 .file02 -rw-r--r-- 1 root victoria 0 Apr 27 09:17 file02

    ./hourly.0/dir01/dir02/.dir03: total 8 drwxr-xr-x 2 root victoria 4096 Apr 27 09:44 . drwxr-xr-x 4 root victoria 4096 Apr 27 09:45 ..

    ./hourly.0/dir01/dir02/dir03: total 8 drwxr-xr-x 2 root victoria 4096 Apr 27 09:45 . drwxr-xr-x 4 root victoria 4096 Apr 27 09:45 .. -rw-r--r-- 1 root victoria 0 Apr 27 09:17 .file03 -rw-r--r-- 1 root victoria 0 Apr 27 09:17 file03

Déplacez ces fichiers, ces répertoires :

Cela semble préserver :

  • horodatage
  • déplace récursivement des fichiers, des répertoires (y compris les fichiers et répertoires cachés)
  • préserve les propriétés

    [victoria@victoria test]$ mv hourly.0/ hourly.1

Après le déménagement :

[victoria@victoria test]$ tree -La 5 -F
.
 hourly.1/
     .dir01/
     dir01/
        .dir02/
        dir02/
           .dir03/
           dir03/
              .file03
              file03
           .file02
           file02
        .file01
        file01
     .file00
     file00

7 directories, 8 files

[victoria@victoria test]$ ls -laR
.:
total 12
drwxr-xr-x 3 victoria victoria 4096 Apr 27 10:05 .
drwxrwxr-x 4 victoria victoria 4096 Apr 27 09:19 ..
drwxr-xr-x 4 victoria victoria 4096 Apr 27 09:45 hourly.1

./hourly.1:
total 16
drwxr-xr-x 4 victoria victoria 4096 Apr 27 09:45 .
drwxr-xr-x 3 victoria victoria 4096 Apr 27 10:05 ..
drwxr-xr-x 2 victoria victoria 4096 Apr 27 09:44 .dir01
drwxr-xr-x 4 victoria victoria 4096 Apr 27 09:45 dir01
-rw-r--r-- 1 victoria victoria    0 Apr 27 09:17 .file00
-rw-r--r-- 1 victoria victoria    0 Apr 27 09:17 file00

./hourly.1/.dir01:
total 8
drwxr-xr-x 2 victoria victoria 4096 Apr 27 09:44 .
drwxr-xr-x 4 victoria victoria 4096 Apr 27 09:45 ..

./hourly.1/dir01:
total 16
drwxr-xr-x 4 victoria victoria 4096 Apr 27 09:45 .
drwxr-xr-x 4 victoria victoria 4096 Apr 27 09:45 ..
drwxr-xr-x 2 victoria victoria 4096 Apr 27 09:44 .dir02
drwxr-xr-x 4 root     victoria 4096 Apr 27 09:45 dir02
-rw-r--r-- 1 victoria victoria    0 Apr 27 09:17 .file01
-rw-r--r-- 1 victoria victoria    0 Apr 27 09:17 file01

./hourly.1/dir01/.dir02:
total 8
drwxr-xr-x 2 victoria victoria 4096 Apr 27 09:44 .
drwxr-xr-x 4 victoria victoria 4096 Apr 27 09:45 ..

./hourly.1/dir01/dir02:
total 16
drwxr-xr-x 4 root     victoria 4096 Apr 27 09:45 .
drwxr-xr-x 4 victoria victoria 4096 Apr 27 09:45 ..
drwxr-xr-x 2 root     victoria 4096 Apr 27 09:44 .dir03
drwxr-xr-x 2 root     victoria 4096 Apr 27 09:45 dir03
-rw-r--r-- 1 root     victoria    0 Apr 27 09:17 .file02
-rw-r--r-- 1 root     victoria    0 Apr 27 09:17 file02

./hourly.1/dir01/dir02/.dir03:
total 8
drwxr-xr-x 2 root victoria 4096 Apr 27 09:44 .
drwxr-xr-x 4 root victoria 4096 Apr 27 09:45 ..

./hourly.1/dir01/dir02/dir03:
total 8
drwxr-xr-x 2 root victoria 4096 Apr 27 09:45 .
drwxr-xr-x 4 root victoria 4096 Apr 27 09:45 ..
-rw-r--r-- 1 root victoria    0 Apr 27 09:17 .file03
-rw-r--r-- 1 root victoria    0 Apr 27 09:17 file03

[victoria@victoria test]$

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X