web-dev-qa-db-fra.com

Comment déplacer récursivement tous les fichiers (y compris ceux-ci) dans un sous-dossier dans un dossier parent dans * Nix?

C'est un peu une question embarrassante, mais je dois admettre que cela tard dans ma carrière, j'ai toujours des questions sur la commande MV.

J'ai souvent ce problème: je dois déplacer tous les fichiers de manière récursive d'un niveau. Disons que j'ai un dossier FOO et une barre de dossier à l'intérieur. La barre a un gâchure de fichiers et de dossiers, y compris des fichiers de points et des dossiers. Comment puis-je tout déplacer dans la barre jusqu'au niveau FOO?

Si FOO est vide, je déplace simplement la barre d'un niveau supérieur, supprimez FOO et renommez la barre à FOO. Une partie du problème est que je ne peux pas comprendre quelle est la carte générique de MV pour "tout y compris les points" est. Une partie de cette question est la suivante: y a-t-il une discussion approfondie des caractères génériques que les commandes CP et MV utilisent quelque part (googling ceci n'apporte que des tutoriels très basiques).

14
deadprogrammer

En Bash (et quelques autres), vous pouvez utiliser l'expansion de la corde pour y accomplir en une seule ligne:

mv bar/{,.}* .

La virgule sépare une null et un point, de sorte que la commande mv voit les noms de fichiers qui correspondent * et .*

Celui-ci récolte tous les fichiers de sous-dossiers et les déplace vers le directeur actuel

find . -type f -exec mv -iv \{} . \;

Si vous souhaitez utiliser des fichiers owwerwrite avec le même nom, utilisez

yes y | find . -type f -exec mv -iv \{} . \;
3
michelek

Le moyen le plus simple de le faire est de le faire dans deux commandes, car * ne correspond pas.

cd /foo
mv bar/* ./
mv bar/.??* ./

Vous ne voulez pas utiliser Bar /.* que j'ai découvert en commettant cette erreur:

rm -rf ./.* 

C'est une mauvaise chose. Quelqu'un veut deviner pourquoi? ;-)

2
Matt Simmons

Première chose à savoir sur Globbing --Il est fait par la coquille, pas la commande. Vérifiez la page Homme de votre coquille pour tous les détails.

2
Jeff Leyser

mv .??* * prendra soin de tout sauf DOT suivi d'un seul caractère. Si cela est courant pour votre situation, vous pouvez ajouter .[a-zA-Z0-9]*. Cela va toujours laisser des fichiers avec des noms tels que .;, .^, et .^I (onglet). Si vous avez besoin de gérer tout, vous devrez être un peu plus complexe.

mv .. `ls -f | egrep -v '^.$|^..$'
1
mpez0

Si vous avez une structure de répertoire /foo/bar/ Et vous souhaitez déplacer tous les fichiers sous bar une étape ci-dessus, entrez dans le répertoire bar et tapez les éléments suivants:

find . -depth -print0 | cpio --null -pvd ../

Généralement, je pense que cpio(1) est meilleur pour ce type de tâches. Vous pouvez consulter la documentation détaillée en émettant info cpio Dans votre coquille.

0
fim