2 votes

Déplacement de fichiers sous linux, ajout de répertoires existants dans la destination

Alors supposons que je l'ai fait :

dest/dir/file1
dest/dir/file2
dest/dir/subdir/subfile1
dest/dir/subdir/subfile2

y

src/dir/file3
src/dir/subdir/subfile3
src/dir/newdir/anotherfile

... et supposons qu'il y ait des milliers de fichiers et de sous-répertoires.

Maintenant, je veux déplacer tous les nouveaux fichiers de src à dest, dans leurs répertoires respectifs, en créant de nouveaux sous-répertoires si nécessaire. Ce serait l'équivalent de " cp -a src/dir dest/ ", mais comme une opération de déplacement. La commande évidente " mv src/dir dest/ " échoue car le répertoire existe déjà dans la destination.

Comment puis-je faire cela avec une seule commande ?

6voto

Dan Gravell Points 320

Vous pouvez utiliser rsync.

rsync -av --remove-source-files src/ dest/

Malheureusement, cela ne supprimera pas les répertoires. Vous pourriez simplement ajouter une autre commande pour les supprimer.

2voto

caliban Points 19715

Ce n'est pas cp -a, le commutateur -a est le commutateur d'archive.

Ce devrait être cp -R, le commutateur récursif.

Vous pouvez également ajouter le commutateur -f pour forcer l'écrasement.

2voto

eroijen Points 101

Alors que le rsync est préférable pour déplacer simplement des fichiers, voici une autre approche : l'utilisation de l'option 拾う pour invoquer de manière répétée mv :

# First, move directories that don't exist on the destination:
(cd src/dir ; find * -type d -print) | while read f; do
   [ ! -d "src/dir/$f" ] || [ -d "dest/dir/$f" ] || mv "src/dir/$f" "dest/dir/$f"
done
# Then move individual files:
(cd src/dir ; find * -type f -print0) | xargs -0 -n1 -i@ /bin/mv src/dir/@ dest/dir/@

# Alternate to the xargs usage, to allow prompting before overwriting files:
(cd src/dir ; find * -type f) | while read f; do
    /bin/mv -i "src/dir/$f" "dest/dir/$f" </dev/tty
done

Notez que :

  • _Trouver * ignorera tous les fichiers/répertoires qui commencent par un point (".").
  • cela ne supprimera pas non plus les répertoires.

J'utilise quelque chose de ce genre, par nuit. cron pour créer des vignettes de nouvelles images dans mes archives d'images personnelles, puis utiliser rsync pour faire une sauvegarde de toutes les images sur une 2ème machine.

0voto

mouviciel Points 3018

Pour autant que je sache, une récursive mv n'est pas possible. Je vous suggère d'effectuer un cp -R suivi d'un rm -r .

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