3 votes

Comment déplacer des fichiers vers le bas d'un répertoire ?

J'ai hérité d'une structure de dossiers sur un projet et je voudrais la simplifier un peu. J'ai une racine pleine de dossiers (1er niveau) et chacun de ces dossiers contient un certain nombre de dossiers (2ème niveau) et chacun de ces dossiers contient quelques fichiers. Cela ressemble à quelque chose comme ceci :

root
|-- dir1
|    |-- dir1.1
|    |      +- file1.txt
|    |-- dir1.2
|    |     +- file2.txt
|    +-- dir1.N
|          +- fileN.txt
|-- dir2
|    |-- dir2.1
|          +- file3.txt
|-- dir3
|    |-- dir3.1
|          +- file4.txt

etc.

J'aimerais supprimer tous les dossiers x.1, simplifier la structure et déplacer tous les fichiers de ces dossiers un niveau plus bas :

root
|-- dir1
|     +- file1.txt
|     +- file2.txt
|     +- fileN.txt
|-- dir2
|     +- file3.txt
|-- dir3
|     +- file4.txt

Comment pourrais-je accomplir quelque chose comme ça avec bash/zsh ?

1voto

Scott Points 20468

Je ne sais pas si cela fonctionnera dans zsh, mais je pense que ce sera le cas dans bash (bien que je ne l'aie pas entièrement testé) :

for f in \*/\*/\*
do
        mv "$f" "$(dirname "$(dirname "$f")")"
done

for f in \*/\*
do
        if \[ –d "$f" \]
        then
                rmdir "$f"
        fi
done

P.S. Dans Unix (contrairement à la botanique, c'est-à-dire dans le monde réel), les arbres ont leurs racines au sommet.  Par conséquent, cette opération serait considérée comme un déplacement de fichiers en haut la structure des répertoires.

0voto

Dave Points 986
for d in */*; do
    mv "$d"/* "$d"/..
    rm -r "$d"
done

Cela ne fonctionne pas si le deuxième niveau contient des répertoires ou des fichiers vides.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X