web-dev-qa-db-fra.com

mv: répertoire non vide

Je souhaite déplacer le contenu d'un répertoire dans un autre répertoire avec les mêmes dossiers.

Voici un exemple:

J'ai ./backup qui ont les répertoires base et test. Maintenant, je veux déplacer ces répertoires dans ./backupArchives.

J'utilise ceci:

mv ./backup/* ./backupArchives

mais j'ai eu l'erreur

mv: cannot move './backup/base' to './backupsArchive/base': Directory not empty

J'ai essayé d'utiliser --force, mais pas de chance. Est-il possible de le déplacer lorsque des dossiers existent déjà?

Remarque: je veux juste fusionner le contenu, il n'y a pas de réécriture.

144
UdK

Bien que sa page de manuel ne le documente pas, mv refusera de renommer un répertoire en un autre répertoire si le répertoire cible contient des fichiers. C’est une bonne chose dans votre cas, car vous souhaitez vouloir fusionner le contenu de la source dans la cible, ce que mv ne fera pas.

Utilisez rsync -a backup/ backupArchives/ à la place. Après cela rm -rf backup/*.

Au lieu d’utiliser rsync, vous pouvez également effectuer les tâches classiques.

(cd backup && tar c .) | (cd backupArchives && tar xf -)

ce qui vous rapporte plus de points geek.

182
zwets

Rapide et sale, si vous savez ce que vous faites:

cp -r ./backup/* ./backupArchives && rm -R ./backup/*
34
patrickvacek

Une fois le répertoire que vous déplacez, vous avez besoin de * (représente un texte ou un nombre). Par exemple:

mv /var/www/* /recovery/wwwrecovery/

c'est tout, si vous déplacez des fichiers, que vous vous déplacez en tant que:

mv /var/www/index.php /recovery/index.php

Une autre méthode consiste à compresser le contenu de ce dossier à l'aide de tar:

tar -cvzpf backup.tar.gz /var/www 

Puis déplacez-le dans un autre fichier. Aussi, je recommande cette étape car tar le compresse et le rend plus petit.

Pour extraire les fichiers dans un autre dossier, utilisez

tar -xvzpf /var/www/

Si vous avez besoin de copier vers un emplacement que vous ne possédez pas, assurez-vous d’ajouter votre commande avec la commande Sudo après l’option que vous décidez d’utiliser.

Sudo tar -cvzpf backup.tar.gz /var/www/
4

Bien sûr, rsyncfonctionne, mais cela pourrait également fonctionner pour les ordinateurs ne prenant pas en charge rsync(c'est-à-dire dans cpanel, où rsync n'est pas installé par défaut).

Qu'en est-il d'utiliser:

cd /path/to/backup/ && cp -R --parents ./* ../backupArchives

Supprimez ensuite le répertoire backupsi nécessaire.

Remarque 1: vous devez cddans le répertoire backupavant d'exécuter le cp -R --parents ....

Remarque 2: revérifiez le répertoire backupArchivessi vous avez récupéré les nouveaux fichiers.

3

Avant de poser la question, considérons un cas simplifié.

Supposons que dans/home/admin, nous avons deux dossiers fooet barqui ont la même structure de sous-répertoires, mais chacun contient des fichiers différents. Maintenant, nous voulons les fusionner en un seul. Lorsque nous faisons des choses comme mv foo/* bar, l'erreur mv: directory not empty se produit.

Ma solution consiste à abandonner les outils de ligne de commande et à basculer vers un gestionnaire de fichiers à interface graphique, par exemple, Dolphin. Lorsque vous renommez fooen bardans dolphin, vous avez la possibilité d'écrire dans le dossier de destination et vous demande si vous souhaitez écraser les fichiers existants de manière interactive. Cela évite les copies et les suppressions, ce qui vous permet de gagner du temps sans une seule ligne de code.

PS: Je n'ai pas testé tous les gestionnaires de fichiers. Mais la plupart d'entre eux devraient avoir cette fonctionnalité.

1
navigaid