Supprimez ces fichiers ".DS_Store" embêtants

13

Si vous utilisez OS X, vous connaissez peut-être les fameux fichiers cachés ".DS_Store" qui sont produits à la suite de l'utilisation du Finder.

Le défi consiste à écrire du code qui traversera tout le système de fichiers et à supprimer tout fichier nommé ".DS_Store".

Golf à code classique - les gains de code les plus courts.


Clarifications:

  • Le code n'a pas besoin de supprimer les fichiers .DS_Store qui nécessitent un superutilisateur; supposons qu'aucun fichier de ce type n'existe.

  • Le code doit seulement supprimer les fichiers .DS_Store pertinents et rien d' autre.

arshajii
la source
3
Le code doit-il supprimer les fichiers .DS_Store qui nécessitent un superutilisateur (dois-je appeler sudo)?
Kaya
1
@Kaya Bonne question: non, il n'a pas besoin de supprimer ces fichiers.
arshajii
27
Est - il correct de supprimer des fichiers non nommés .DS_Storeaussi ?
Joey Adams
1
@JohannesKuhn La dernière modification aurait dû aller de soi, je suppose. Je l'ai ajouté par souci d'exhaustivité. Mais j'apprécie néanmoins la réponse intelligente!
arshajii
1
@Joey - Transposer la question dans le domaine militaire - par exemple, hmm… les militaires des USA, au hasard ^^. Et remplacez «fichier nommé« .DS_Store »» par «personne à tuer». Et vous verrez que l'exigence «seulement» est loin d'être évidente.
Nicolas Barbulesco

Réponses:

14

zsh, 19

rm -f /**/.DS_Store

(Faites 16 si vous pouvez laisser de côté -f.)

copie
la source
12

Bash *, 40 30

find / -name .DS_Store -delete

find / -name .DS_Store -exec rm -f {} \;

Cela devrait le gérer (pas très golfé, pas.à.mention merveilleusement lent). Bash semble juste parce que nous n'avons pas à faire face à n'importe quel non-sens "système d'importation". Si vous souhaitez exiger l'exécution dans n'importe quel environnement, ajoutez 4 caractères pour bashet 1 pour un saut de ligne.

* n'importe quel shell, je suppose, ne peut tout simplement pas sortir de l'habitude en supposant que le shell bourne est à nouveau le seul.

Kaya
la source
1
Bash est exactement le bon outil pour cela.
Johannes Kuhn
1
Quel genre d' findOS X? Avec GNU findest encore plus courte: find / -name .DS_Store -delete.
manatwork
1
Sous réserve de l' erreur « Argument list too long » et nécessite soit bash4 ou plus récent avec globstaroption shell activée ou zsh: rm /**/.DS_Store.
manatwork
1
Vous ne faites rien de spécifique à bash, donc ça pourrait aussi bien être sh.
Peter Taylor
10
Il a supprimé mon .DS_Storerépertoire où j'avais des choses importantes.
Konrad Borowski
9

Ruby: 38 33 caractères

File.delete *Dir['/**/.DS_Store']
homme au travail
la source
2
Dir[...]est un raccourci pour Dir.glob(...), cela vous fera économiser 5 caractères.
Patrick Oscity
3
Argh! Je savais qu'il y avait un moyen plus court, mais je l'ai recherché Kernel. Merci, @padde.
manatwork
2

poisson, 16

rm /**/.DS_Store

(Assurez-vous que 19 -fest nécessaire pour supprimer .DS_Storedans les répertoires en lecture seule.)

Pierre Carrier
la source
0

Coquille, 25

locate .DS_Store|xargs rm

Nécessite une locatebase de données fonctionnelle .

Gaelan
la source
3
Nécessite également des chemins sans espaces.
manatwork
0

Python 3 , 80 octets

import os
d='.DS_Store'
for r,_,f in os.walk('/'):
 if d in f:os.remove(r+'/'+d)

Essayez-le en ligne!

Pas du tout compétable, mais juste pour le plaisir :)

movatica
la source
0

CMD, 17

del/s "/.DS_Store

Assez simple.

/sest également requis pour la recherche dans les sous-répertoires.
"est utilisé pour échapper au caractère /qui serait autrement interprété comme un argument (invalide).


la source
-1

trouver, 38

La findsolution précédente est tout à fait erronée: il s'agit de supprimer tout ce qui est nommé, .DS_Storey compris le répertoire, les liens, le fichier spécial, etc.

Mais:

find / -type f -name .DS_Store -delete

c'est la solution minimale à utiliser find.

AVERTISSEMENT : Je déconseille fortement d'utiliser vraiment cette solution sur une vraie boîte * nix: essayer de supprimer récursivement quelque chose /est une très mauvaise idée. Vous êtes prévenu.

MODIFIER :

Si les différences entre les fichiers, les répertoires, les liens (physiques et symboliques), les canaux nommés, les sockets, les fichiers spéciaux, les systèmes de pseudo-fichiers ne vous sont pas claires, je suggère de rechercher sur Google certains de ces termes inconnus. Vous serez surpris, plus sage et moins sujet aux erreurs (catstrofiques).

EDIT2 : Encore plus pertinent: l'OP a écrit "Le code ne devrait supprimer que les fichiers .DS_Store pertinents et rien d'autre." : donc, si quelqu'un se soucie de lire les exigences ennuyeuses , toutes les solutions qui suppriment plus que ces fichiers sont drôles, intelligentes, etc. mais mal .

DavAlPi
la source
La findsolution précédente est correcte. La question dit «supprimez tout fichier nommé« .DS_Store »». Donc, aucune exigence particulière basée sur le type de fichier.
manatwork
@ manatwork: non-sens: un fichier est différent d'un répertoire. Le long de votre ligne torsadée, la meilleure solution reste rm -rf /
DavAlPi
2
Ohh, vous n'avez pas google: en.wikipedia.org/wiki/Everything_is_a_file
Johannes Kuhn
3
Ohh, et une autre chose: dans le golf de code, le but est d'obtenir la solution la plus courte, donc si vous pouvez enregistrer quelques caractères en évaluant les exigences en votre faveur, eh bien, tant pis. Vous pouvez enregistrer 8 caractères en traitant tout comme un fichier, comme le fait Unix. PS: où était la surprise? Le fait que certaines personnes nient le principe de base d'UNIX?
Johannes Kuhn
1
Maintenant, j'ai une meilleure réponse , quelque chose que tout le monde ici peut comprendre.
DavAlPi