Comment supprimer tous les fichiers et répertoires cachés à l'aide de Bash?


28

La solution évidente produit un code de sortie de 1:

bash$ rm -rf .*
rm: cannot remove directory `.'
rm: cannot remove directory `..'
bash$ echo $?
1

Une solution possible passera le "." et les répertoires ".." mais ne supprimeront que les fichiers dont les noms dépassent 3 caractères:

bash$ rm -f .??*

Eh bien, si vous n'êtes pas trop inquiet de ne pas pouvoir supprimer. & .. alors qui s'en soucie? à moins que vous ne vous inquiétiez de la sortie moche dans un script, je pense que la solution évidente est moins de frappe que les autres franchement.
— Matt

Juste pour que vous sachiez, .. et. ne sont pas des fichiers. Ce sont des références à des répertoires. . (un seul point) est le répertoire courant et .. (deux points) est un lien vers le répertoire d'un niveau supérieur. Par exemple, si cd / home / user,. est égal à / home / user et .. est / home / En d'autres termes, vous ne pouvez pas supprimer le. et .. (.?)
— phuzion

Merci pour le commentaire Matt. J'utilise souvent la commande dans des scripts avec vérification de code de sortie par commande (set -e). Dans ces cas, un code de sortie indicatif est nécessaire.
— Yonatan Broza

Il n'y a rien d'inhérent. et .. qui les protège de la suppression avec rm -rf. Ce n'est qu'un mécanisme de protection ajouté dans les variantes modernes de rm.
— kubanczyk

Et il y a toujours rm -rf. * || true si vous voulez simplement contourner le comportement set -e pour cette seule instruction.
— Domingo Ignacio Galdos

Réponses:


34
rm -rf. [^.]. ?? *

Devrait attraper tous les cas. Le. ?? * ne correspondra qu'à 3+ noms de fichiers de caractères (comme expliqué dans la réponse précédente), le. [^.] Interceptera deux entrées de caractères (autres que ..).


Merci d'avoir répondu! Sur cette base, je suis également arrivé à la version plus courte de "rm -rf. [^.] *".
— Yonatan Broza,

4
Soyez prudent avec cette version plus courte, elle donnera des résultats similaires, mais pas identiques. Il ne correspondra pas aux noms avec deux points à l'avant (par exemple "... /" qui est parfois vu cacher des rootkits, etc.)
— Russell Heilling

Et soyez prudent de faire un contrôle PWD ou de perdre tous vos paramètres :)
— kommradHomer

Cela ne semble pas fonctionner zsh. Aucune suggestion?
— ryanjdillon

Avec zshpar défaut, une correspondance générique vide est traitée comme une erreur; alors qu'avec bashelle est simplement passée inchangée. Pour faire zshse comporter de la même manière, vous pouvez utiliser la commandeunsetopt nomatch
— Russell Heilling

1
find -path './.*' -delete

Cela correspond à tous les fichiers du répertoire courant qui commencent par a .et les supprime récursivement. Les fichiers cachés dans des répertoires non cachés ne sont pas touchés.

Au cas où vous voudriez vraiment tout effacer d'un répertoire, find -deletecela suffirait.


Cela supprimera tout, pas seulement les entrées commençant par.
— kasperd

Oh, il semble que j'ai mal lu la question comme "supprimer tout, y compris les fichiers cachés" ... Eh bien, mon mauvais.
— Fritz

@kasperd Merci, il devrait maintenant répondre à la question.
— Fritz

0

la meilleure façon est probablement:

  • trouver . -iname. * -maxdepth 1 -type f -exec rm {} \;

changez rm en ls -l si vous voulez juste voir ce qui serait supprimé, pour commenter la sortie u peut vouloir ajouter l' option -v à rm

  • -type f options indique à la commande find de ne rechercher que les fichiers (omettez les répertoires, les liens, etc.)
  • -maxdepth 1 indique à find de ne pas descendre dans les sous-répertoires

ps. n'oubliez pas de terminer '\;'


1
Prudent! Vous voulez dire -iname '. *' Ou -iname. * Ou bien vous allez glisser. et .. encore une fois de toute façon.
— Domingo Ignacio Galdos

-1
ls -la | awk '$NF ~ /^\.[^.]+/  {print $NF}' | xargs rm -rf

ls -la ............. long list (all files and folders)
$NF ................ last field (file or folder name)
~   ................ Regular Expression match
/^\.[^.]+/ ......... dot followed by not dot at least once +

If the last field $NF match pattern show it and send 
it to xargs which will perform the task.

Cela rompt l'instant où vous avez un fichier avec un espace dans son nom.
— un CVn
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.