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!)
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.
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.
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
!)
Ce que je vais faire avec mon shell (zsh) est le suivant (mais je pense que bash ther est quelque chose d’équivalent).
Type
echo application/*(/)
et, sans toucher le retour , appuyez sur TAB.
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
Maintenant, je voudrais éditer la ligne pour supprimer les répertoires que je veux maintenir.
Je triple vérifier et éditer le echo
initial à rm -rf
.
Je vérifie encore et ...
... 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 .