Vous ne pouvez pas simplement échapper les arguments pour les transmettre à find
.
Toute expansion de l'interpréteur de commandes va se produire avant d'exécuterfind
. find
ne passera pas ses arguments à travers un shell, donc même si vous échappez à l'expansion du shell, tout sera simplement traité comme des arguments littéraux à la commande test
, pas développé par le shell comme vous l'attendez.
La meilleure façon d'obtenir ce que vous voulez serait d'écrire un script shell, qui prend le nom de fichier comme argument, et utiliser -exec
sur ce point:
find . -type f -exec is_html.sh {} \; -print
avec is_html.sh
:
#!/bin/sh
test $(file --brief --mime-type "$1") == 'text/html'
Si vous voulez vraiment tout sur une ligne, sans utiliser un script séparé, vous pouvez appeler sh
directement à partir de find
:
find . -type f -exec sh -c 'test $(file --brief --mime-type "$0") == "text/html"' {} \; -print
J'avais peur que ce soit la réponse! J'essaie d'éviter de créer un script de commande séparé juste pour le test. Cela semble fonctionner aussi: 'trouver. -type f -exec fichier --mime-type '{}' \; | grep 'text/html' | couper -d ':' -f1', mais j'espérais une solution plus générale à ce genre de pattern. –
Vous pouvez également utiliser l'option -c de bash au lieu d'écrire le code dans un fichier séparé: find. -type f -exec bash -c 'test $ (fichier --brief --mime-type "$ 1") == "text/html"' '' {} \; -print –
@Bart Oui, vous pouvez tout mettre en ligne en invoquant 'bash' ou' sh' directement; Je pensais qu'il serait plus clair d'utiliser un fichier distinct, mais vous avez raison, si vous voulez vraiment tout mettre sur une ligne, vous pouvez le faire. –