mv: répertoire non vide

155

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

Voici un exemple:

J'ai ./backupqui ont les répertoires baseet 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. Y a-t-il un moyen de le déplacer quand les dossiers existent déjà?

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

UdK
la source
Essayez-vous simplement de fusionner le contenu des dossiers dans la destination ou tentez-vous d'écraser le contenu de la destination? (Cela aide également si vous avez l'erreur ENTIÈRE, sans utiliser ...... pour tronquer les données)
Thomas Ward
Je veux juste fusionner le contenu, il n'y a pas de réécriture.
UdK
2
@UdK Même si cela fonctionnerait, notez que cela ne fusionnerait pas le contenu des deux répertoires. Déplacer un répertoire remplacera sa cible. Jetez un coup d'oeil à la rsyncplace, cela fera la fusion.
Zwets

Réponses:

188

Bien que sa page de manuel ne le documente pas, mvrefusera 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 finissez par vouloir fusionner le contenu de la source dans la cible, ce qui mvne fonctionnera pas.

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

Au lieu d'utiliser rsync, vous pouvez également faire le classique

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

ce qui vous rapporte plus de points geek.

zwets
la source
4
belles choses à savoir! Les deux fonctionnent très bien. Merci!
UdK
5
Les points Geek sont les meilleurs points: D
MadMike
2
Notez que cela nécessite que vous ayez la taille du dossier en espace libre. Et causera des problèmes horribles sinon.
Pogrindis
4
@Pogrindis S'il vous plaît expliquer quels problèmes horribles vont se produire et en quoi ils sont différents de toute autre tentative d'écriture sur un disque complet? En effet, étant donné que les deux opérations conservent le répertoire d'origine intact, si l'opération échoue, vous obtenez simplement rm -rf backupArchivessans conséquences, sans parler des conséquences «horribles».
Zwets
4
Merci d'avoir nommé l'approche classique, très utile si rsync n'est pas disponible! sudo sh -c '(cd backup && tar c .) | (cd backupArchives && tar xf -)'
Fonctionne
39

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

cp -r ./backup/* ./backupArchives && rm -R ./backup/*
Patrickvacek
la source
3
Fonctionne également dans mon mode sans échec, génie.
Banned_User
4

Après le répertoire que vous déplacez vous avez besoin *(représente n'importe quel texte ou 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, veillez à bien ajouter votre commande avec la sudocommande après l'option que vous décidez d'utiliser.

sudo tar -cvzpf backup.tar.gz /var/www/
Dimitris Theodoridis
la source
J'utilise Ubuntu 12.10 et j'ai: mv: option non valide - 'R' Essayez 'mv --help' pour plus d'informations. En effet, .tar est bien, mais je dois savoir comment déplacer mes fichiers pour cette situation. Merci pour votre aide
UdK
J'utilise 12.04 desktop et server et cela fonctionne bien dans les deux cas. Attention, si vous ne faites pas de place entre folfer et -R. j'ai aussi essayé sans -R fonctionne de la même manière pour moi, essayez sans -R, mais soyez prudent avec l'orthographe: linux est important, mais les lettres majuscules et minuscules !!! que si le chemin est incorpore en mouvement ou en déplacement. si vous n'avez pas ce dossier que vous voulez déplacer, placez-le après et il le créera. essayez également d'abord: recherchez le nom -iname de votre dossier et exécutez cette commande à partir de la racine, uniquement pour voir si elle existe ailleurs si vous manquez quelque chose d'épelé. donnez-moi le commandement exact que vous avez utilisé
Dimitris Theodoridis
Ce que thaaa ..... a mis ce nom de fichier entre **
Dimitris Theodoridis
1
Cela -Rne devrait sûrement pas venir après le premier argument. Les options (presque) précèdent toujours les arguments de la commande. En outre, mvn’a pas d’ -Roption, et enfin, la récursivité n’a aucune incidence sur a mv. @ DimitrisTheodoridis, veuillez d'abord tester votre réponse.
Zwets
oui mon frère tu as raison, j'ai toujours des problèmes avec mon orthographe, et toujours j'ai un problème avec le terminal pour cela ou commande non trouvée ou créer de nouveaux fichiers et répertoires que je ne sais pas, juste pour bas orthographe ... par la façon dont je utilisé cp command, qu'ici écrit mv sory pour ce frère: D
Dimitris Theodoridis
4

Bien sûr, rsynccela fonctionne, mais cela pourrait également fonctionner pour une machine qui ne supporte pas rsync(par exemple, 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

Puis supprimez le backuprépertoire si nécessaire

Note1: Vous devez accéder cdau backuprépertoire avant d’exécuter lecp -R --parents ...

Note2: Vérifiez le backupArchivesrépertoire si vous avez récupéré les nouveaux fichiers.

Atillo Regner Rex
la source
1

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épertoire, mais chacun contient des fichiers différents en elle. Maintenant, nous voulons les fusionner en un seul. Lorsque nous faisons des choses comme mv foo/* bar, l'erreur mv: directory not emptyse 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 fooà barDolphin, il vous donne 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é.

navigaid
la source