Déplacer tous les fichiers des sous-répertoires vers le répertoire actuel?

11

Comment puis-je déplacer les fichiers contenus dans tous les sous-répertoires vers le répertoire actuel, puis supprimer les sous-répertoires vides?

J'ai trouvé cette question , mais en adaptant la réponse à:

mv * .

n'a pas marché; J'ai reçu beaucoup d'avertissements ressemblant à:

mv: wil and ./wil are identical

Les fichiers contenus dans les sous-répertoires ont des noms uniques.

Richard
la source

Réponses:

20

Vous pouvez également utiliser l' -mindepthoption:

find . -type f -mindepth 2 -exec mv -i -- {} . \;

(En même temps que -maxdepthvous, vous pouvez également limiter les niveaux de hiérarchie à partir desquels collecter les fichiers.)

J'ai utilisé mv -i(«interactif») pour mvdemander avant d'écraser des fichiers. Avec beaucoup de sous-répertoires, il peut y avoir des conflits de noms pour lesquels vous souhaitez être averti.

L' --option arrête le traitement des options, afin d' mvéviter toute confusion avec les noms de fichiers commençant par un trait d'union.

Nettoyez l’ensemble des sous-répertoires vides avec

find . -depth -mindepth 1 -type d -empty -exec rmdir {} \;
Florian Jenn
la source
Existe-t-il également un moyen de passer la question de la réécriture des fichiers en ne les écrasant pas?
Filnor
1
Options pour mv:: -n, --no-clobberne pas écraser un fichier existant. Vous pourriez être intéressé -b, --backupaussi.
Florian Jenn
4

Essaye ça:

find ./*/* -type f -print0 | xargs -0 -J % mv % .

Plus d'infos: Essayez le find-stamement seul, il devrait vous donner une liste avec tous les fichiers que vous voulez déplacer (laissez de côté le -print0). Exemple:

probe:test trurl$ find ./*/* -type f
./test_s/test_s_s/testf4
./test_s/test_s_s/testf5
./test_s/testf1
./test_s/testf2
./test_s/testf3
./test_s2/testf6
./test_s2/testf7

avec -print0et xargsvous créez maintenant une liste d'instructions à exécuter. Le -J %drapeau signifie, insère l'élément list ici, il mv $FILE .est donc exécuté pour chaque fichier trouvé.

Ce qui précède fonctionne pour le xargs BSD. Si vous utilisez la version GNU (Linux), prenez à la -I %place de-J %

trurl
la source
0

Bash 4:

shopt -s globstar
for file in **; do [[ -f "$file" ]] && mv "$file" .; done
à
la source
-2

1 astuce rapide, ne fonctionne que si vos fichiers ont des extensions (avec un point):

mv *.* subdir/
mv .* subdir/
Guillermo
la source
-2

Il suffit de lancer cette commande :-)

mv **/*.* .

Paul Digi
la source
1
Cela ne trouvera pas les fichiers qui n'ont pas .de nom dans leur nom, n'est-ce pas?
G-Man