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 .??*
Yonatan Broza
la source
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 ..).

Russell Heilling
la source
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.

Fritz
la source
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 '\;'


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