Supprimer tous les fichiers récursivement sans supprimer les répertoires

10

Je veux "nettoyer" tous les fichiers d'un répertoire, y compris tous les fichiers dans les sous-répertoires mais je veux laisser les sous-répertoires en place. Je crois comprendre rm -rque cela supprimera également les sous-répertoires eux-mêmes.

Je ne veux pas supprimer les fichiers cachés (points).

Comment cela peut-il être fait?

Scott Wilton
la source
1
find -type f ! -name "[.]*" -deletene convient pas?
Costas
Je ne sais pas. Est-ce que ça fait ce que je demande?
Scott Wilton
Essayez sans -delete- il suffit d'imprimer les noms de fichiers à supprimer.
Costas
Voulez-vous supprimer des fichiers (cachés ou non) dans des répertoires cachés?
Stéphane Chazelas
Qu'en est-il des liens symboliques vers des répertoires?
Stéphane Chazelas

Réponses:

10

Utilisez findpour cela:

find . ! -name '.*' ! -type d -exec rm -- {} +
jimmij
la source
1
Toutes les implémentations n'ont pas trouvé-delete
wurtel
3
@RomeoNinov veuillez lire la question OP:I do not want to delete hidden (dot) files.
jimmij
1
@Costas, non, il n'y a pas de shell qui nécessite un échappement +(du moins pas dans les familles Bourne, csh ou rc). Il y a une légende qui dit que certaines anciennes versions de l' cshéchappement requis {}mais je ne les ai jamais rencontrées.
Stéphane Chazelas
1
@ScottWilton Les répertoires cachés sont inclus, mais pas les fichiers cachés dans les répertoires cachés. Si vous voulez rejeter tous les fichiers dans des répertoires cachés, alors find . ! -name '.*' ! -type d ! -path '*/.*'faites le travail.
jimmij
1
@jimmy, plutôt find . -name '.?*' -prune -o ! -type d -exec rm {} +pour éviter de descendre dans ceux-ci. Notez que ce --n'est pas nécessaire ici (ne fait pas de mal cependant) puisque les chemins commencent par ./.
Stéphane Chazelas
0

essayez quelque chose comme:

find <path> ! -name '.*' -type f -exec rm {} \;
Roméo Ninov
la source
Une raison pour laquelle supprimer les fichiers un à la fois au lieu d'accélérer les choses .... -exec rm {} + ?
Anthon
Je préfère faire les choses une par une. Les opérations de masse (et parallèles) ont un certain temps des effets secondaires étranges (et désagréables) (qui font une énorme charge sur le sous-système d'E / S)
Romeo Ninov
1
-exec rm {} +n'est pas parallèle, il appelle simplement rmavec plusieurs noms de fichiers. Il exécute moins d' rmappels et est donc plus convivial pour les ressources. S'il est légèrement moins sûr en ce sens qu'il agrandit la fenêtre de course dans laquelle un composant de répertoire des fichiers à supprimer peut être changé en lien symbolique. Mais seulement -deleteou -execdir rm {} \;répondrait pleinement à cela.
Stéphane Chazelas
@ StéphaneChazelas, aucun d'entre eux (-delete ou -execdir) n'existe sous UNIX. Et je ne vois pas en question être mentionné linux!
Romeo Ninov
@RomeoNinov, oui, j'ai dit dans un autre commentaire ici que seul le -execstandard. -deleteet -execdirproviennent de BSD cependant, GNU les a ajoutés environ 10 ans plus tard. En tout cas, cela n'a rien à voir avec Linux, qui n'est qu'un noyau.
Stéphane Chazelas