Quelle est la commande pour supprimer tous les fichiers mais pas les répertoires?


23

Disons que j'ai une arborescence de répertoires comme celle-ci:

FOLDER:
    file1
    file2
    file3
    Subfolder1:
        file1
        file2
    Subfolder2:
        file1
        file2

Si j'utilisais rm -r FOLDER/*, tout dans FOLDER serait supprimé, y compris les sous-répertoires. Comment puis-je supprimer tous les fichiers dans FOLDER et dans ses sous-répertoires sans supprimer les répertoires réels?

Réponses:


37

Ce que vous essayez de faire, c'est une suppression récursive. Pour cela, vous avez besoin d'un outil récursif, tel que find.

find FOLDER -type f -delete

13

Avec bash:

shopt -s globstar  ## Enables recursive globbing
for f in FOLDER/**/*; do [[ -f $f ]] && echo rm -- "$f"; done

Ici, itération sur les noms de fichiers étendus glob, et suppression uniquement des fichiers.

Ce qui précède est un essai à sec, si vous êtes satisfait des modifications à apporter, retirez-les echopour une suppression réelle:

for f in FOLDER/**/*; do [[ -f $f ]] && rm -- "$f"; done

Enfin, non défini globstar:

shopt -u globstar

Avec zsh, en tirant parti du qualificatif glob:

echo -- FOLDER/**/*(.)

(.) est un qualificatif glob, qui limite les extensions glob aux seuls fichiers normaux.

Ce qui précède imprimera simplement les noms de fichiers, pour une suppression réelle:

rm -- FOLDER/**/*(.)

2
+1 pour zsh globbing. Plus de gens devraient être conscients des choses impressionnantes que zsh peut faire.
marcelm

11

Si votre version de findne prend pas en charge, -deletevous pouvez utiliser ce qui suit pour supprimer tous les fichiers du répertoire actuel et ci-dessous.

find . ! -type d -exec rm '{}' \;

-exec rm {} +serait plus rapide, surtout s'il y a beaucoup de fichiers.
muru

Et find . ! -type d -exec rm {} +supprime également les liens sym.
Justice pour Monica

1
@muru: Si une implémentation particulière de findne prend pas en charge, -deleteelle ne le prend probablement pas non -exec ... {} +plus. La façon recommandée de traiter cela est find ... -print0 | xargs -r0 rm(si l'on s'attend à de nombreuses correspondances potentielles).
David Foerster

5
@DavidFoerster pas vraiment. -exec ... {} +est POSIX, mais -deletene l'est pas. (Ni d'ailleurs -print0, d'ailleurs.)
Muru

@muru: Assez juste. J'ai rencontré au moins deux findimplémentations non POSIX qui ont pris en charge -print0mais pas -exec ... {} +(je ne m'en souviens pas -deletecependant). L'un était sous OS X, l'autre sous Solaris (il y a quelques années sur un système mis à jour de façon très conservatrice). Vous pouvez également remplacer -print0par -printf '%p\0'. Quoi qu'il en soit, c'est Ask Ubuntu et non Unix et Linux et Ubuntu utilise GNU find depuis toujours.
David Foerster
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.