J'ai le problème suivant. J'ai une structure de répertoires et je souhaite supprimer tout ce qui se trouve dans un répertoire nommé Caches . Tout doit être supprimé sauf tous les répertoires nommés Snapshots . Je n'arrive pas à comprendre comment faire cela avec trouver ou toute autre commande que je connais.
La raison pour laquelle je demande :sur iOS, chaque application a son propre répertoire Caches. Ceux-ci ne sont parfois pas effacés correctement, selon l'application. Avec la solution à cette réponse, on pourrait effacer les caches sur iOS, et donc optimiser l'espace disque, lorsque le lecteur des appareils est monté sur un autre ordinateur, par ex. avec FUSE (iExplorer).
Voici ce que j'ai jusqu'à présent :
find . 2>/dev/null -type d -name "Caches" -maxdepth 3 -print
Cela renvoie quelque chose comme :
./Library/Caches
Quand je fais un ls ./Library/Caches Je vois tous les contenus et les Snapshots répertoire, que je veux exclure parce que finalement je veux -delete tout sauf celui-ci.
Je veux quelque chose comme ça :
Before: After:
. .
├── a ├── a
│ ├── a │ ├── a
│ └── Caches │ └── Caches
│ ├── a │ └── a
│ │ └── Snapshots │ └── Snapshots
│ │ └── a │ └── a
│ ├── b └── b
│ │ └── a └── c
│ └── c
└── b
├── c
└── Caches
├── a
│ └── foo
│ └── a
└── b
└── a
Réponse acceptée :
find . -depth -print0 | perl -0lne '
if ("$_/" =~ m{/Caches(/.*)}s && $1 !~ m{/Snapshots/}) {rmdir $_ or unlink $_}'
Si votre find ne prend pas en charge -print0 , vous pouvez le remplacer par -exec printf '%s\0' {} + .
L'idée est d'imprimer la liste des fichiers terminés par NUL (car 0 est le seul octet qui ne peut pas apparaître dans un chemin de fichier) et d'utiliser perl 's -n avec -0 option pour exécuter du code pour chacun de ces noms de fichiers (avec $_ défini sur le nom de fichier).
Avec -depth , les fichiers sont imprimés avant leur répertoire parent. Nous supprimons uniquement les fichiers ou répertoires (en supposant qu'ils soient vides, c'est pourquoi il est important de traiter la liste en depth order) si leur chemin contient /Caches/ non suivi de /Snapshosts/ .