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?

PKM
la source

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
Sergiy Kolodyazhnyy
la source
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/**/*(.)
heemayl
la source
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 '{}' \;

la source
-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