web-dev-qa-db-fra.com

Script pour "extraire" les sous-dossiers dans le dossier parent

Ça va être un peu délicat, je suppose :-)

Lorsque j'ouvre un terminal dans le dossier et exécute un script, ce script doit:

  1. déplacer tout le contenu de tous les sous-dossiers dans un dossier parent supérieur (de manière récursive)
  2. supprimer tous les dossiers vides

Le dossier parent dans lequel nous nous trouvons ne contiendra aucun dossier, mais seulement le contenu de tous les dossiers.

Cela devrait également fonctionner pour les fichiers et dossiers cachés. Ce serait extrêmement utile pour le ménage :-)

J'ai essayé quelque chose comme:

find . -type f -name "*" -depth | xargs mv ./

Mais sans chance.

Merci de votre aide :-)

5
Sebastian

La manière la plus simple et la plus propre, à mon avis, serait d'utiliser cette commande:

find . -type f -exec mv --backup=numbered {} . \; && find . -maxdepth 1 -type d -exec rm -r {} +

find commande n ° 1:

  • .: recherche dans le répertoire de travail actuel;
  • -type f: recherche des fichiers;
  • -exec [...]: exécute une commande pour chaque résultat (en utilisant {} [...] \;) ou une commande pour tous les résultats (en utilisant {} +);
  • mv --backup=numbered . \;: déplace chaque résultat dans le répertoire de travail actuel, créant une sauvegarde des fichiers avec le même nom de fichier déjà dans le répertoire de travail actuel;

find commande n ° 2:

  • .: recherche dans le répertoire de travail actuel;
  • -maxdepth 1: recherche uniquement dans le premier niveau de la hiérarchie du répertoire cible;
  • -type d: recherche des répertoires;
  • -exec [...]: exécute une commande pour chaque résultat (en utilisant {} [...] \;) ou une commande pour tous les résultats (en utilisant {} +);
  • rm -r {} +: supprime chaque résultat;

Test sur une hiérarchie de répertoires de tests:

user@debian ~/tmp % tree -a
.
├── 1
│   ├── file1
│   ├── file2
│   ├── file3
│   └── .hidden
├── 2
│   ├── file1
│   ├── file2
│   ├── file3
│   └── .hidden
└── 3
    ├── file1
    ├── file2
    ├── file3
    └── .hidden

3 directories, 12 files
user@debian ~/tmp % find . -type f -exec mv --backup=numbered {} . \; && find . -type d -exec rm -r {} +
rm: refusing to remove "." or ".." directory: skipping "."
user@debian ~/tmp % tree -a
.
├── file1
├── file1.~1~
├── file1.~2~
├── file2
├── file2.~1~
├── file2.~2~
├── file3
├── file3.~1~
├── file3.~2~
├── .hidden
├── .hidden.~1~
└── .hidden.~2~

0 directories, 12 files
9
kos
  1. Pour déplacer tous les fichiers de manière récursive dans le répertoire en cours, notez que cela déplacera tous les fichiers dans ce répertoire (pas leurs répertoires parents):

    find . -type f -exec mv -i -t . {} +  
    

Au lieu de -i, vous pouvez utiliser --backup=numbered comme déjà montré par @kos.

  1. Pour supprimer tous les répertoires vides:

    find . -type d -empty -delete
    

Lisez man find pour avoir plus d'idées.

5
heemayl

Cela devrait faire l'affaire pour vous:

find . -type f -exec mv --backup=numbered "{}" . \; && find . -type d -empty -delete

C'est 2 commandes find, la première trouve et déplace les fichiers, la seconde ne fonctionnera que si la première commande réussit et supprimera les répertoires.

Merci à Rinzwind d'avoir signalé le danger de doublons de noms de fichiers, m'invitant à ajouter l'option --backup=numbered utilisée à l'origine par Kos.

2
Arronical