Voici une version simplifiée avec des explications étendues pour les débutants comme moi qui essaient d'apprendre à mettre plus d'une commande sur une ligne.
Si vous deviez écrire le problème par étapes, cela ressemblerait à ceci:
// For every file in this directory
// Check the filetype
// If it's an ASCII file, then print out the filename
Pour ce faire , on peut utiliser trois commandes UNIX: find
, file
et grep
.
find
vérifiera tous les fichiers du répertoire.
file
nous donnera le type de fichier. Dans notre cas, nous recherchons un retour de 'texte ASCII'
grep
cherchera le mot-clé 'ASCII' dans la sortie de file
Alors, comment pouvons-nous les assembler en une seule ligne? Il y a plusieurs façons de le faire, mais je trouve que le faire dans l'ordre de notre pseudo-code a le plus de sens (surtout pour un débutant comme moi).
find ./ -exec file {} ";" | grep 'ASCII'
Ça a l'air compliqué, mais pas mal quand on le décompose:
find ./
= parcourez tous les fichiers de ce répertoire. La find
commande imprime le nom de fichier de tout fichier qui correspond à l'expression, ou tout ce qui vient après le chemin, qui dans notre cas est le répertoire courant ou./
La chose la plus importante à comprendre est que tout ce qui suit ce premier bit sera évalué comme vrai ou faux. Si True, le nom du fichier sera imprimé. Sinon, la commande continue.
-exec
= cet indicateur est une option dans la commande find qui nous permet d'utiliser le résultat d'une autre commande comme expression de recherche. C'est comme appeler une fonction dans une fonction.
file {}
= la commande appelée à l'intérieur de find
. La file
commande renvoie une chaîne qui vous indique le type de fichier d'un fichier. Régulièrement, il ressemblerait à ceci: file mytextfile.txt
. Dans notre cas, nous voulons qu'il utilise n'importe quel fichier examiné par la find
commande, nous mettons donc les accolades {}
pour agir comme une variable ou un paramètre vide. En d'autres termes, nous demandons simplement au système de générer une chaîne pour chaque fichier du répertoire.
";"
= ceci est requis par find
et est le signe de ponctuation à la fin de notre -exec
commande. Voir le manuel pour «trouver» pour plus d'explications si vous en avez besoin en exécutant man find
.
| grep 'ASCII'
= |
est un tuyau. Le tuyau prend la sortie de ce qui se trouve à gauche et l'utilise comme entrée pour ce qui se trouve à droite. Il prend la sortie de la find
commande (une chaîne qui est le type de fichier d'un seul fichier) et la teste pour voir si elle contient la chaîne 'ASCII'
. Si c'est le cas, il renvoie vrai.
MAINTENANT, l'expression à droite de find ./
retournera true lorsque la grep
commande retourne true. Voila.
find . -type f -exec grep -Il "" {} \;
.