web-dev-qa-db-fra.com

Supprimer uniquement les fichiers du répertoire sur les répertoires Linux NOT

Quelle commande de suppression peut être exécutée pour supprimer uniquement les fichiers du répertoire donné

  • PAS les répertoires
  • PAS les sous-répertoires
  • PAS de fichiers dans ces sous-répertoires.

Certains fichiers n'ont pas d'extensions, donc rm *.* ne fonctionnera pas ...

Il y a des milliers de fichiers dans ce dossier.

Aucun conseil?

53
AndrewC

Vous pouvez utiliser find avec -type f pour les fichiers uniquement et -maxdepth 1 donc find ne recherchera pas les fichiers dans les sous-répertoires de /path/to/directory. rm -i vous invitera à chaque suppression afin que vous puissiez confirmer ou refuser la suppression. Si vous ne vous souciez pas qu'on vous demande de confirmer chaque suppression, remplacez-la par rm -fv (-f pour forcer la suppression). Le -v flag fait en sorte qu'à chaque suppression, un message soit imprimé indiquant quel fichier vient d'être supprimé.

find /path/to/directory -maxdepth 1 -type f -exec rm -iv {} \;

Cela devrait répondre aux critères:

PAS les répertoires
PAS les sous-répertoires
PAS de fichiers dans ces sous-répertoires.

50
chown
find PATH -maxdepth 1 -type f -delete

MAIS cela ne vous demandera pas de confirmation ou de sortie ce qu'il vient de supprimer. Par conséquent, il est préférable de l'exécuter sans l'action -delete en premier et de vérifier qu'il s'agit des fichiers corrects.

39
James

Étant donné que cela est élevé dans la recherche Google, la réponse la plus simple est:

rm $directoryPath/*

où $ directoryPath est le répertoire que vous souhaitez vider. Les crédits devraient aller à cbm3384 (qui, pour une raison quelconque, a obtenu des votes négatifs pour cette réponse, pourquoi?)

Si vous ne souhaitez pas confirmer:

rm -f $directoryPath/*

Si vous ne croyez pas, essayez man rm ou

mkdir -p 1/2/3; echo 'hello1' > 1/hello1.txt; echo 'hello2' > 1/2/hello2.txt;echo 'hello3' > 1/2/3/hello3.txt
rm 1/2/*

Ce qui précède crée une structure de répertoire, qui a "helloX.txt" dans chaque dossier (X est le niveau du répertoire). rm 1/2/* supprime hello2.txt et laisse l'autre structure intacte.

Également rm */*/* supprime uniquement hello2.txt. C'est le seul qui correspond au modèle.

Juste un exemple de Makefile qui nettoie le répertoire tmp de cakephp et laisse la structure du répertoire intacte:

clean:
    -rm -f tmp/*
    -rm -f tmp/*/*
    -rm -f tmp/*/*/*
    -rm -f tmp/*/*/*/*

Moins devant le rm signifie "ne vous arrêtez pas sur les erreurs" (le répertoire non supprimé renvoie une erreur). Si vous souhaitez enregistrer un certain niveau, supprimez simplement cette ligne, par ex. la deuxième ligne rm supprime les journaux.

Faites-moi savoir si vous avez un système qui fait autre chose (BSD?).

EDIT: J'ai testé cela sur ubuntu 12.04, osx lion et sourceforge.net Shell. Tous se comportent comme l'explication ci-dessus.

15
Juha

rm ne supprimera pas les répertoires par défaut. Donc, dans votre exemple, en supposant que vous êtes dans le répertoire parent et que ce sont tous les fichiers, tout ce dont vous avez besoin est:

rm *
8
Andriyun

TL; DR:

find . -maxdepth 1 -type f -delete

Etc:

Ce n'est pas grave mais les suggestions ci-dessus n'ont pas fonctionné pour moi car ...

find . -type f -maxdepth 1 -delete

find: avertissement: vous avez spécifié l'option -maxdepth après un argument non-option -type, mais les options ne sont pas positionnelles (-maxdepth affecte les tests spécifiés avant lui ainsi que ceux spécifiés après). Veuillez spécifier les options avant les autres arguments.

7
Geoffrey Hale

rm dirname/*? Sans pour autant -f il ne sera pas forcé de supprimer, sans -r il ne récurrera pas et ne supprimera pas les répertoires ainsi que les fichiers.

4
Dave Newton

rm -f dirname/* supprimera uniquement les fichiers sans demander pour chaque fichier. Il affichera également "Cannnot remove 'subdirname': Is a directory" pour chaque sous-répertoire.

4
cbm3384

Pour cela, j'utiliserais find avec une profondeur maximale de 1 puis exec rm avec la liste des fichiers.

find ./dir -maxdepth 1 -type f -exec rm -rf '{}' \;

Edit: c'est essentiellement la même chose que ce que James a posté mais je n'ai vu son post qu'après

1
th3v0id