GNU/Linux >> Tutoriels Linux >  >> Linux

Utilisez Rechercher pour trouver certains répertoires et supprimer tous les fichiers qu'il contient sauf un répertoire ?

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


Linux
  1. Supprimer tous les fichiers sauf dans un certain sous-répertoire avec Find ?

  2. Comment obtenir tous les fichiers dépassant une certaine taille et les supprimer

  3. Commande pour lister tous les fichiers sauf . (point) et .. (point point)

  4. Supprimer les fichiers correspondants dans tous les sous-répertoires

  5. Supprimer tous les fichiers aléatoires sauf 1000 dans un répertoire

Comment trouver le nombre de fichiers dans un répertoire et des sous-répertoires

Comment rechercher et supprimer des fichiers en double sous Linux

Rechercher et supprimer le fichier le plus ancien s'il y a plus de X fichiers dans un répertoire sous Linux

Pouvez-vous modifier les autorisations sur tous les fichiers sauf un répertoire sous Linux ?

Comment supprimer tous les fichiers d'un répertoire sauf certains ?

Comment puis-je supprimer de manière récursive tous les fichiers et répertoires vides sous Linux ?