web-dev-qa-db-fra.com

mv: impossible d'écraser un répertoire avec un autre répertoire

Est-il possible de contourner ce problème?

J'ai une situation où j'ai besoin de déplacer certains fichiers dans l'un des répertoires ci-dessous.

/a/b/c/d/e/f/g

le problème est que le nom du fichier dans le répertoire g/ est identique au nom du répertoire

et je reçois l'erreur suivante:

mv: cannot overwrite directory `../297534' with non-directory

Exemple: /Home/user/data/doc/version/3766/297534 est un répertoire. À l'intérieur, vous trouverez également un fichier nommé 297534.

j'ai donc besoin de déplacer ce fichier dans/home/user/data/doc/version/3766 

Commande Voici ce que je lance: (dans une boucle for)

cd /home/user/data/doc/version/3766/297534
mv * ../
13
anarchist

Vous ne pouvez pas forcer mv à écraser un répertoire avec un fichier portant le même nom. Vous devrez supprimer ce fichier avant d'utiliser votre commande mv.

11
lreeder

Ajoutez un autre calque dans votre boucle.

Remplacez mv * ../ par

for f in `ls`; do rm -rf ../$f; mv $f ..; done

Cela garantira que tout conflit sera supprimé en premier, en supposant que vous ne vous souciez pas du répertoire que vous écrasez. 

Notez que va exploser si vous avez un fichier dans le répertoire actuel qui correspond au nom du répertoire actuel. Par exemple, si vous êtes dans /home/user/data/doc/version/3766/297534 et que vous essayez de déplacer un répertoire appelé 297534 vers le haut. Une solution consiste à ajouter un long suffixe à chaque fichier, de sorte qu'il y a peu de chances qu'une correspondance soit trouvée.

for f in `ls`; do mv $f ../${f}_abcdefg; done
0
merlin2011