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/
.