web-dev-qa-db-fra.com

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

Disons que j'ai un arbre de répertoire comme ceci:

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

Si j’utilisais rm -r FOLDER/*, tout le contenu de FOLDER serait supprimé, y compris les sous-répertoires. Comment puis-je supprimer tous les fichiers de FOLDER et de ses sous-répertoires sans supprimer les répertoires actuels?

22
PKM

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

find FOLDER -type f -delete
36

Avec bashname__:

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

Ici, itératif sur les noms de fichiers étendus globaux, et ne supprimant que les fichiers.

Ce qui précède correspond à un essai à blanc. Si vous êtes satisfait des modifications à apporter, supprimez echopour la suppression effective:

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

Enfin, désélectionnez globstarname__:

shopt -u globstar

Avec zshname__, exploitant le qualificatif glob:

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

(.) est un qualificatif de glob, qui limite les extensions de glob à seulement des fichiers normaux.

Ce qui précède n’imprimera que les noms de fichiers, pour une suppression effective:

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

Si votre version de find ne prend pas en charge -delete, vous pouvez utiliser ce qui suit pour supprimer tous les fichiers du répertoire en cours et des répertoires inférieurs.

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