Donc, le comportement suivant d'Unix Find me coûte très cher:
> touch foo
> touch bar
> ls
bar foo
> find . -name '*oo' -delete
> ls
bar
> touch baz
> ls
bar baz
> find . -delete -name '*ar'
> ls
> #WHAAAT?
Comment ça peut vouloir dire quelque chose?
Réponses:
La ligne de commande de find est constituée de différents types d'options, qui sont combinés pour former des expressions.
L'
find
option-delete
est une action.Cela signifie qu'il est exécuté pour chaque fichier correspondant jusqu'à présent.
Comme première option après les chemins, tous les fichiers sont mis en correspondance ... oups!
C'est dangereux - mais la page de manuel contient au moins un gros avertissement :
De
man find
:De plus haut en
man find
:En essayant ce que
find
fera une commande:Pour voir à quoi ressemble une commande
supprimera, vous pouvez d'abord remplacer l'action
-delete
par une action plus inoffensive - comme-fls
ou-print
:Cela imprimera les fichiers affectés par l'action.
Dans cet exemple, -print peut être omis. Dans ce cas, il n'y a pas d' action du tout, donc on ajoute implicitement la plus évidente:
-print
. (Voir le deuxième paragraphe de la section "EXPRESSIONS" citée ci-dessus)la source
-delete
drapeau :-) Mais y a-t-il une raison pour laquelle quelqu'un ferait jamaisfind . -delete
plutôt querm -rf .
? Ou est-ce simplement la façon dont ilfind
analyse et traite ses arguments?warning: use -depth when testing stuff you later want to -delete
elle pas ce que vous n'avez pas fait dans votre exemple pratique?-n
option; La première commande ne devrait évidemment pas avoir d’utilité pratique; Je vais le changer.Dans l'
find
ordre des arguments, ça compte beaucoup.Les arguments peuvent être des options, des tests et des actions. Vous devez généralement utiliser les options d'abord, puis les tests, puis les actions.
Parfois,
find
même vous met en garde contre un éventuel mauvais ordre (par exemple lorsque vous utilisez-maxdepth
après d'autres arguments), mais d'autres, il semble que non.Qu'est
find . -delete -name '*ar'
- ce que c'est:Ce que vous voulez probablement faire, c'est:
Cela, pour chaque fichier, verra s'il correspond
'*ar'
, et seulement s'il remplit la condition, il supprimera le fichier.Désolé si vous l'avez découvert trop tard.
la source