Aquí hay una versión simplificada con una explicación extendida para principiantes como yo que están tratando de aprender a poner más de un comando en una línea.
Si tuviera que escribir el problema en pasos, se vería así:
// For every file in this directory
// Check the filetype
// If it's an ASCII file, then print out the filename
Para lograr esto, podemos utilizar tres comandos UNIX: find
, file
, y grep
.
find
comprobará todos los archivos del directorio.
file
nos dará el tipo de archivo. En nuestro caso, estamos buscando un retorno de 'texto ASCII'
grep
buscará la palabra clave 'ASCII' en la salida de file
Entonces, ¿cómo podemos unirlos en una sola línea? Hay varias formas de hacerlo, pero creo que hacerlo en el orden de nuestro pseudocódigo tiene más sentido (especialmente para un principiante como yo).
find ./ -exec file {} ";" | grep 'ASCII'
Parece complicado, pero no está mal cuando lo desglosamos:
find ./
= revise todos los archivos de este directorio. El find
comando imprime el nombre de archivo de cualquier archivo que coincida con la 'expresión', o lo que venga después de la ruta, que en nuestro caso es el directorio actual o./
Lo más importante que debe comprender es que todo lo que esté después del primer bit se evaluará como Verdadero o Falso. Si es True, se imprimirá el nombre del archivo. Si no es así, el comando sigue adelante.
-exec
= esta bandera es una opción dentro del comando de búsqueda que nos permite usar el resultado de algún otro comando como expresión de búsqueda. Es como llamar a una función dentro de una función.
file {}
= el comando que se llama dentro de find
. El file
comando devuelve una cadena que le indica el tipo de archivo de un archivo. Regularmente, se vería así: file mytextfile.txt
. En nuestro caso, queremos que use cualquier archivo que esté siendo examinado por el find
comando, por lo que colocamos las llaves {}
para que actúe como una variable vacía o parámetro. En otras palabras, solo estamos pidiendo que el sistema genere una cadena para cada archivo en el directorio.
";"
= esto es requerido por find
y es el signo de puntuación al final de nuestro -exec
comando. Consulte el manual de 'buscar' para obtener más explicaciones si lo necesita ejecutándolo man find
.
| grep 'ASCII'
= |
es una pipa. Pipe toma la salida de lo que está a la izquierda y la usa como entrada para lo que está a la derecha. Toma la salida del find
comando (una cadena que es el tipo de archivo de un solo archivo) y la prueba para ver si contiene la cadena 'ASCII'
. Si lo hace, devuelve verdadero.
AHORA, la expresión a la derecha de find ./
devolverá verdadero cuando el grep
comando devuelva verdadero. Voila.
find . -type f -exec grep -Il "" {} \;
.