web-dev-qa-db-fra.com

Comment supprimer tous les fichiers / dossiers du dossier sauf quelques dossiers?

Supposons que j'ai une structure de répertoire comme suit:

application
│
├── config
│   ├── c1.conf
│   └── c2.conf
│
├── logs
│   ├── l1.txt
│   └── l2.txt
│
└── src
    ├── static
    ├── s1.py
    └── s2.py

Maintenant, je veux supprimer tous les dossiers sauf config et logs (dans ce cas, seul src). ma PWD est actuellement un parent de appliaction/ dir (c'est-à-dire que je peux voir application dans mon PWD).

Quelle commande devrais-je utiliser? (J'ai essayé avec rm -rf avec quelques options, mais j'ai supprimé par erreur d'autres fichiers, alors j'aimerais connaître la bonne réponse avant d'essayer autre chose!)

3
Sangram

Essayez find ./application/ -type d -not -name config -not -name logs.

Si cela renvoie les répertoires appropriés, exécutez

find ./application/ -type d -not -name config -not -name logs -exec rm -R {} \;

Le exec rm -R {} \; à la fin supprime le répertoire même s'il n'est pas vide.

7
Jos

Cela représente un peu plus de travail que d’autres solutions possibles, mais lorsque je supprime des fichiers, j’aime pouvoir vérifier ce qui se passe pour toujours. Les étapes ci-dessous supposent que vous pouvez voir "application" dans votre PWD, comme indiqué dans votre question.

Commencez par créer un nouveau fichier texte contenant les noms de chaque dossier que vous souhaitez conserver (et non pas supprimer), avec un dossier par ligne. Enregistrez-le sous to-keep.txt par exemple:

config
logs

Copiez ensuite le texte suivant dans un éditeur de texte et enregistrez-le sous le nom rm-exclude.sh afin que les trois fichiers se trouvent dans le même répertoire.

#!/usr/bin/env bash

find "./$1" -maxdepth 1 -type d ! -path "./$1" > to-delete.txt

dels=`cat to-delete.txt`
readarray -t keeps < to-keep.txt

for keep in "${keeps[@]}"; do
    dels=`echo "$dels" | grep -v "$keep"`
done

echo "$dels" > to-delete.txt

Le rendre exécutable en utilisant:

chmod +x rm-exclude.sh

Puis exécutez-le avec ce qui suit, où PATH est le chemin du dossier "application" de votre PWD. Dans votre exemple, PATH serait simplement application.

./rm-exclude.sh PATH

Enfin, vérifiez to-delete.txt pour vous assurer que rien ne sera supprimé, et exécutez:

readarray -t dels < to-delete.txt; for del in "${dels[@]}"; do rm -rf "$del"; done

Si vous ne vous souciez pas de vérifier le contenu du fichier txt, vous pouvez simplement copier et coller la commande ci-dessus à la fin de rm-exclude.sh pour que l'exécution du script fasse tout aussi longtemps que vous avez to-keep.txt déjà rempli. Le résultat final devrait être que chaque sous-dossier direct de application ne figurant pas dans to-keep.txt sera supprimé, ainsi que leur contenu.

1
TheSchwa

Basé sur réponse de Jos , je l'utilise pour supprimer tous les fichiers et répertoires du répertoire actuel uniquement, à l'exception du répertoire .git.

Sudo find /home/jeffy/Django_files/djauth_lifecycle_tutorial/part_04/ -maxdepth 1 -mindepth 1 -not -name .git -exec rm -rf {} \;

En fait, j'ai eu peur et j'ai pensé que cela supprimait également le répertoire .git, mais j'avais oublié d'utiliser l'indicateur a avec la (ls -la).

L’indicateur mindepth permet d’éviter de supprimer le répertoire racine lui-même. -maxdepth empêche le renvoi de tous les sous-répertoires et fichiers, qui sont redondants avec l'indicateur f.

(En outre, n'utilisez jamais de chemins relatifs lorsque vous utilisez rm -r!)

1
aliteralmind

Ce que je vais faire avec mon shell (zsh) est le suivant (mais je pense que bash ther est quelque chose d’équivalent).

  1. Type

    echo application/*(/) 
    

et, sans toucher le retour , appuyez sur TAB.

  1. le shell développera le motif glob; dans ce cas, une liste de tous les répertoires sous application; la ligne devrait être maintenant

    echo application/config application/logs application/src
    
  2. Maintenant, je voudrais éditer la ligne pour supprimer les répertoires que je veux maintenir.

  3. Je triple vérifier et éditer le echo initial à rm -rf.

  4. Je vérifie encore et ...

  5. ... frappé le retour.

Quoi qu’il en soit, ce genre de tâche (sélectionner à la main des fichiers ou des dossiers pour y appliquer une action) s’effectue vraiment mieux avec une sorte d’aide visuelle, sauf si vous êtes un "nerd" en ligne de commande comme moi ... par exemple, les gens sont vraiment aime de Midnight Commander .

0
Rmano