Capítulo 1. Combinar comandos
Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com
Cuando trabajas en Windows, macOS y la mayoría de los demás sistemas operativos, probablemente pasas el tiempo ejecutando aplicaciones como navegadores web, procesadores de texto, hojas de cálculo y juegos. Una aplicación típica está repleta de funciones: todo lo que los diseñadores pensaron que necesitarían sus usuarios. Por tanto, la mayoría de las aplicaciones son autosuficientes. No dependen de otras aplicaciones. Puede que copies y pegues entre aplicaciones de vez en cuando, pero en su mayor parte son independientes.
La línea de comandos de Linux es diferente. En lugar de grandes aplicaciones con toneladas de funciones, Linux proporciona miles de pequeños comandos con muy pocas funciones. El comando cat
, por ejemplo, imprime archivos en la pantalla y eso es todo. ls
enumera los archivos de un directorio, mv
renombra archivos, y así sucesivamente. Cada comando tiene una finalidad sencilla y bastante bien definida.
¿Y si necesitas hacer algo más complicado? No te preocupes. Linux facilita la combinación de comandos para que sus funciones individuales trabajen juntas para lograr tu objetivo. Esta forma de trabajar produce una mentalidad muy diferente sobre la informática. En lugar de preguntarte "¿Qué aplicación debo ejecutar?" para conseguir algún resultado, la pregunta pasa a ser "¿Qué comandos debo combinar?".
En este capítulo aprenderás a organizar y ejecutar comandos en distintas combinaciones para hacer lo que necesitas. Para simplificar las cosas, te presentaré sólo seis comandos de Linux y sus usos más básicos, para que puedas centrarte en la parte más compleja e interesante -combinarlos- sin una enorme curva de aprendizaje. Es un poco como aprender a cocinar con seis ingredientes, o aprender carpintería con sólo un martillo y una sierra. (En elCapítulo 5 añadiré más comandos a tu caja de herramientas de Linux).
Combinarás comandos utilizando tuberías, una función de Linux que conecta la salida de un comando con la entrada de otro. Cuando introduzca cada comando (wc
, head
, cut
, grep
, sort
, y uniq
), demostraré inmediatamente su uso con tuberías. Algunosejemplos serán prácticos para el uso diario de Linux, mientras que otros son sólo ejemplos de juguete para demostrar una característica importante.
Entrada, salida y tuberías
La mayoría de los comandos de Linux leen la entrada del teclado, escriben la salida en la pantalla, o ambas cosas. Linux tiene nombres elegantes para esta lectura y escritura:
- stdin (se pronuncia "entrada estándar" o "standard in")
-
El flujo de entrada que Linux lee de tu teclado. Cuando escribes cualquier comando en un prompt, estás suministrando datos en stdin.
- stdout (pronunciado "salida estándar" o "salida estándar")
-
El flujo de salida que Linux escribe en tu pantalla. Cuando ejecutas el comando
ls
para imprimir nombres de archivos, los resultados aparecen en stdout.
Ahora viene la parte guay. Puedes conectar la salida estándar de un comando a la entrada estándar de otro, de modo que el primer comando alimente al segundo. Empecemos con el conocido comando ls -l
para listar un directorio grande, como /bin, en formato largo:
$ ls -l /bin total 12104 -rwxr-xr-x 1 root root 1113504 Jun 6 2019 bash -rwxr-xr-x 1 root root 170456 Sep 21 2019 bsd-csh -rwxr-xr-x 1 root root 34888 Jul 4 2019 bunzip2 -rwxr-xr-x 1 root root 2062296 Sep 18 2020 busybox -rwxr-xr-x 1 root root 34888 Jul 4 2019 bzcat ⋮ -rwxr-xr-x 1 root root 5047 Apr 27 2017 znew
Este directorio contiene muchos más archivos que líneas tiene tu pantalla, por lo que la salida se desplaza rápidamente fuera de la pantalla. Es una pena que ls
no pueda imprimir la información pantalla a pantalla, haciendo una pausa hasta que pulses una tecla para continuar. Pero espera: otro comando de Linux tiene esa función. El comando less
muestra un archivo de pantalla en pantalla:
$ less myfile View the file; press q to quit
Puedes conectar estos dos comandos porque ls
escribe en stdout yless
puede leer de stdin. Utiliza una tubería para enviar la salida de ls
a la entrada de less
:
$ ls -l /bin | less
Este comando combinado muestra el contenido del directorio pantalla a pantalla. La barra vertical (|
)entre los comandos es el símbolo de tubería de Linux.1 Conecta la salida estándar del primer comando con la entrada estándar del siguiente. Cualquier línea de comandos que contenga tuberías se denomina tubería.
Por lo general, los comandos no son conscientes de que forman parte de una canalización. ls
cree que está escribiendo en la pantalla, cuando en realidad su salida ha sido redirigida a less
. Y less
cree que está leyendo del teclado, cuando en realidad está leyendo la salida de ls
.
Seis comandos para empezar
Las tuberías son una parte esencial de la pericia en Linux. Vamos a sumergirnos en el desarrollo de tus habilidades con las tuberías con un pequeño conjunto de comandos Linux, de modo que no importa con cuáles te encuentres más adelante, estarás preparado para combinarlos.
Los seis comandos -wc
, head
, cut
, grep
, sort
y uniq
- tienen numerosas opciones y modos de funcionamiento que omitiré en gran medida por ahora para centrarme en las tuberías. Para saber más sobre cualquier comando, ejecuta el comando man
para ver la documentación completa. Porejemplo:
$ man wc
Para demostrar nuestros seis comandos en acción, utilizaré un archivo llamadoanimales.txt que enumera cierta información de los libros de O'Reilly, mostrado enel Ejemplo 1-1.
Ejemplo 1-1. Dentro del archivo animals.txt
python Programming Python 2010 Lutz, Mark snail SSH, The Secure Shell 2005 Barrett, Daniel alpaca Intermediate Perl 2012 Schwartz, Randal robin MySQL High Availability 2014 Bell, Charles horse Linux in a Nutshell 2009 Siever, Ellen donkey Cisco IOS in a Nutshell 2005 Boney, James oryx Writing Word Macros 1999 Roman, Steven
Cada línea contiene cuatro datos sobre un libro de O'Reilly, separados por un único carácter de tabulación: el animal de la portada, el título del libro, el año de publicación y el nombre del primer autor.
Comando nº 1: wc
El comando wc
imprime el número de líneas, palabras y caracteres de un archivo:
$ wc animals.txt 7 51 325 animals.txt
wc
informa de que el archivo animals.txt tiene 7 líneas, 51 palabras y 325 caracteres. Si cuentas los caracteres a ojo, incluyendo espacios y tabuladores, encontrarás sólo 318 caracteres, pero wc
también incluye el carácter invisible de nueva línea que termina cada línea.
Las opciones -l
, -w
, y -c
indican a wc
que imprima sólo el número de líneas, palabras y caracteres, respectivamente:
$ wc -l animals.txt 7 animals.txt $ wc -w animals.txt 51 animals.txt $ wc -c animals.txt 325 animals.txt
Contar es una tarea tan útil y de uso general que los autores dewc
diseñaron el comando para que funcionara con tuberías. Lee de la entrada estándar si omites el nombre del archivo, y escribe en la salida estándar. Utilicemos ls
para listar el contenido del directorio actual y canalicémoslo a wc
para contar las líneas. Esta tubería responde a la pregunta: "¿Cuántos archivos hay visibles en mi directorio actual?".
$ ls -1 animals.txt myfile myfile2 test.py $ ls -1 | wc -l 4
La opción -1
, que indica a ls
que imprima sus resultados en una sola columna, no es estrictamente necesaria aquí. Para saber por qué la he utilizado, consulta la barra lateral "ls cambia su comportamiento cuando se redirige".
wc
es el primer comando que has visto en este capítulo, así que estás un poco limitado en lo que puedes hacer con las tuberías. Sólo por diversión, canaliza la salida de wc
hacia sí misma, demostrando que el mismo comando puede aparecer más de una vez en una canalización. Este comando combinado informa de que el número de palabras en la salida de wc
es cuatro: tres enteros y unnombre de archivo:
$ wc animals.txt 7 51 325 animals.txt $ wc animals.txt | wc -w 4
¿Por qué parar ahí? Añade un tercer wc
a la tubería y cuenta líneas, palabras y caracteres en la salida "4":
$ wc animals.txt | wc -w | wc 1 1 2
La salida indica una línea (que contiene el número 4), una palabra (el propio número 4) y dos caracteres. ¿Por qué dos? Porque la línea "4" termina con un carácter de nueva línea invisible.
Ya está bien de pipelines tontos con wc
. A medida que adquieras más comandos, las canalizaciones serán más prácticas.
Comando nº 2: cabeza
El comando head
imprime las primeras líneas de un archivo. Imprime las tres primeras líneas deanimals.txt con head
utilizando la opción -n
:
$ head -n3 animals.txt python Programming Python 2010 Lutz, Mark snail SSH, The Secure Shell 2005 Barrett, Daniel alpaca Intermediate Perl 2012 Schwartz, Randal
Si solicitas más líneas de las que contiene el archivo, head
imprime todo el archivo (como hace cat
). Si omites la opción -n
, head
imprime por defecto 10 líneas (-n10
).
Por sí solo, head
es útil para echar un vistazo a la parte superior de un archivo cuando no te interesa el resto del contenido. Es un comando rápido y eficaz, incluso para archivos muy grandes, porque no necesita leer todo el archivo. Además, head
escribe en stdout, lo que lo hace útil en pipelines. Cuenta el número de palabras de las tres primeras líneas de animales.txt:
$ head -n3 animals.txt | wc -w 20
head
también puede leer desde stdin para divertirse más. Un uso habitual es reducir la salida de otro comando cuando no te interesa verlo todo, como un largo listado de directorios. Por ejemplo, lista los cinco primeros nombres de archivo del directorio /bin:
$ ls /bin | head -n5 bash bsd-csh bunzip2 busybox bzcat
Comando nº 3: cortar
El comando cut
imprime una o varias columnas de un archivo. Por ejemplo, imprime todos los títulos de libros de animales.txt, que aparecen en la segunda columna:
$ cut -f2 animals.txt Programming Python SSH, The Secure Shell Intermediate Perl MySQL High Availability Linux in a Nutshell Cisco IOS in a Nutshell Writing Word Macros
cut
proporciona dos formas de definir lo que es una "columna". La primera es cortar por campo (-f
), cuando la entrada consiste en cadenas (campos) separadas cada una por un único carácter de tabulación. Convenientemente, ése es exactamente el formato del archivo animals.txt. El comandocut
anterior imprime el segundo campo de cada línea, gracias a la opción -f2
.
Para acortar la salida, envíala a head
para imprimir sólo las tres primeras líneas:
$ cut -f2 animals.txt | head -n3 Programming Python SSH, The Secure Shell Intermediate Perl
También puedes cortar varios campos, separando sus números de campo concomas:
$ cut -f1,3 animals.txt | head -n3 python 2010 snail 2005 alpaca 2012
o por rango numérico:
$ cut -f2-4 animals.txt | head -n3 Programming Python 2010 Lutz, Mark SSH, The Secure Shell 2005 Barrett, Daniel Intermediate Perl 2012 Schwartz, Randal
La segunda forma de definir una "columna" para cut
es por posición de carácter, utilizando la opción -c
. Imprime los tres primeros caracteres de cada línea del archivo, que puedes especificar con comas (1,2,3
) o como un rango (1-3
):
$ cut -c1-3 animals.txt pyt sna alp rob hor don ory
Ahora que has visto la funcionalidad básica, prueba algo más práctico con cut
y tuberías. Imagina que el archivo animals.txt tiene miles de líneas y necesitas extraer sólo los apellidos de los autores. Primero, aísla el cuarto campo, nombre del autor:
$ cut -f4 animals.txt Lutz, Mark Barrett, Daniel Schwartz, Randal ⋮
A continuación, vuelve a enviar los resultados a cut
, utilizando la opción -d
(que significa "delimitador") para cambiar el carácter separador por una coma en lugar de un tabulador, para aislar los apellidos de los autores:
$ cut -f4 animals.txt | cut -d, -f1 Lutz Barrett Schwartz ⋮
Ahorra tiempo con el historial de comandos y la edición
¿Reescribes muchos comandos? En su lugar, pulsa repetidamente la tecla de flecha arriba para desplazarte por los comandos que hayas ejecutado antes. (Esta función del shell se denomina historial de comandos.) Cuando llegues al comando deseado, pulsa Intro para ejecutarlo inmediatamente, o edítalo primero utilizando las teclas de flecha izquierda y derecha para colocar el cursor y la tecla Retroceso para borrar. (Esta función es la edición de la línea de comandos.)
Hablaré de funciones mucho más potentes para el historial de comandos y la edición en el Capítulo 3.
Comando nº 4: grep
grep
es un comando extremadamente potente, pero por ahora ocultaré la mayoría de sus capacidades y diré que imprime las líneas que coinciden con una cadena dada. (Encontrarás más detalles en el Capítulo 5.) Por ejemplo, el siguiente comando muestra las líneas de animals.txt que contienen la cadena Nutshell
:
$ grep Nutshell animals.txt horse Linux in a Nutshell 2009 Siever, Ellen donkey Cisco IOS in a Nutshell 2005 Boney, James
También puedes imprimir las líneas que no coincidan con una cadena determinada, con la opción-v
. Observa que las líneas que contienen "Nutshell" están ausentes:
$ grep -v Nutshell animals.txt python Programming Python 2010 Lutz, Mark snail SSH, The Secure Shell 2005 Barrett, Daniel alpaca Intermediate Perl 2012 Schwartz, Randal robin MySQL High Availability 2014 Bell, Charles oryx Writing Word Macros 1999 Roman, Steven
En general, grep
es útil para encontrar texto en una colección de archivos. El siguiente comando imprime las líneas que contienen la cadena Perl
en archivos cuyos nombres terminan en .txt:
$ grep Perl *.txt animals.txt:alpaca Intermediate Perl 2012 Schwartz, Randal essay.txt:really love the Perl programming language, which is essay.txt:languages such as Perl, Python, PHP, and Ruby
En este caso, grep
encontró tres líneas coincidentes, una en animales.txty dos en ensayo.txt.
grep
lee stdin y escribe stdout, por lo que es ideal para pipelines. Supongamos que quieres saber cuántos subdirectorios hay en el gran directorio /usr/lib. No existe un único comando Linux que proporcione esa respuesta, así que construye una canalización. Empieza con el comando ls -l
:
$ ls -l /usr/lib drwxrwxr-x 12 root root 4096 Mar 1 2020 4kstogram drwxr-xr-x 3 root root 4096 Nov 30 2020 GraphicsMagick-1.4 drwxr-xr-x 4 root root 4096 Mar 19 2020 NetworkManager -rw-r--r-- 1 root root 35568 Dec 1 2017 attica_kde.so -rwxr-xr-x 1 root root 684 May 5 2018 cnf-update-db ⋮
Observa que ls -l
marca los directorios con un d
al principio de la línea. Utiliza cut
para aislar la primera columna, que puede ser o no un d
:
$ ls -l /usr/lib | cut -c1 d d d - - ⋮
A continuación, utiliza grep
para conservar sólo las líneas que contengan d
:
$ ls -l /usr/lib | cut -c1 | grep d d d d ⋮
Por último, cuenta las líneas con wc
, y tendrás tu respuesta, producida por un pipeline de cuatro comandos: /usr/lib contiene 145 subdirectorios:
$ ls -l /usr/lib | cut -c1 | grep d | wc -l 145
Comando nº 5: ordenar
El comando sort
reordena las líneas de un archivo en orden ascendente (por defecto):
$ sort animals.txt alpaca Intermediate Perl 2012 Schwartz, Randal donkey Cisco IOS in a Nutshell 2005 Boney, James horse Linux in a Nutshell 2009 Siever, Ellen oryx Writing Word Macros 1999 Roman, Steven python Programming Python 2010 Lutz, Mark robin MySQL High Availability 2014 Bell, Charles snail SSH, The Secure Shell 2005 Barrett, Daniel
u orden descendente (con la opción -r
):
$ sort -r animals.txt snail SSH, The Secure Shell 2005 Barrett, Daniel robin MySQL High Availability 2014 Bell, Charles python Programming Python 2010 Lutz, Mark oryx Writing Word Macros 1999 Roman, Steven horse Linux in a Nutshell 2009 Siever, Ellen donkey Cisco IOS in a Nutshell 2005 Boney, James alpaca Intermediate Perl 2012 Schwartz, Randal
sort
puede ordenar las líneas alfabéticamente (por defecto) o numéricamente (con la opción -n
). Lo demostraré con líneas que recortan el tercer campo de animals.txt, el año de publicación:
$ cut -f3 animals.txt Unsorted 2010 2005 2012 2014 2009 2005 1999 $ cut -f3 animals.txt | sort -n Ascending 1999 2005 2005 2009 2010 2012 2014 $ cut -f3 animals.txt | sort -nr Descending 2014 2012 2010 2009 2005 2005 1999
Para saber el año del libro más reciente en animales.txt, canaliza la salida de sort
a la entrada de head
e imprime sólo la primera línea:
$ cut -f3 animals.txt | sort -nr | head -n1 2014
Valores máximos y mínimos
sort
y head
son potentes compañeros cuando se trabaja con datos numéricos, un valor por línea. Puedes imprimir el valor máximo canalizando los datos a:
... | sort -nr | head -n1
e imprime el valor mínimo con:
... | sort -n | head -n1
Como otro ejemplo, vamos a jugar con el archivo /etc/passwd, que enumera los usuarios que pueden ejecutar procesos en el sistema.4 Generará una lista de todos los usuarios por orden alfabético. Si echas un vistazo a las cinco primeras líneas, verás algo como esto
$ head -n5 /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin smith:x:1000:1000:Aisha Smith,,,:/home/smith:/bin/bash jones:x:1001:1001:Bilbo Jones,,,:/home/jones:/bin/bash
Cada línea está formada por cadenas separadas por dos puntos, y la primera cadena es el nombre de usuario, por lo que puedes aislar los nombres de usuario con el comandocut
:
$ head -n5 /etc/passwd | cut -d: -f1 root daemon bin smith jones
y clasifícalos:
$ head -n5 /etc/passwd | cut -d: -f1 | sort bin daemon jones root smith
Para obtener la lista ordenada de todos los nombres de usuario, no sólo de los cinco primeros, sustituye head
por cat
:
$ cat /etc/passwd | cut -d: -f1 | sort
Para detectar si un usuario determinado tiene una cuenta en tu sistema, haz coincidir su nombre de usuario con grep
. Una salida vacía significa que no hay cuenta:
$ cut -d: -f1 /etc/passwd | grep -w jones jones $ cut -d: -f1 /etc/passwd | grep -w rutabaga (produces no output)
La opción -w
indica a grep
que sólo debe coincidir con palabras completas, no con palabras parciales, en caso de que tu sistema también tenga un nombre de usuario que contenga "jones", como sallyjones2
.
Comando nº 6: uniq
El comando uniq
detecta líneas repetidas y adyacentes en un archivo. Por defecto, elimina las repeticiones. Lo demostraré con un archivo sencillo que contiene letras mayúsculas:
$ cat letters A A A B B A C C C C $ uniq letters A B A C
Observa que uniq
redujo las tres primeras líneas A
a una sola A
, pero dejó la última A
en su sitio porque no era adyacente a las tres primeras.
También puedes contar las ocurrencias con la opción -c
:
$ uniq -c letters 3 A 2 B 1 A 4 C
Lo admito, cuando me encontré por primera vez con el comando uniq
, no le vi mucha utilidad, pero rápidamente se convirtió en uno de mis favoritos. Supón que tienes un archivo separado por tabuladores con las calificaciones finales de los alumnos de un curso universitario, que van desde A
(la mejor) hasta F
(la peor):
$ cat grades C Geraldine B Carmine A Kayla A Sophia B Haresh C Liam B Elijah B Emma A Olivia D Noah F Ava
Te gustaría imprimir la calificación con más apariciones. (Si hay empate, imprime sólo una de las ganadoras.) Comienza aislando las calificaciones con cut
y ordenándolas:
$ cut -f1 grades | sort A A A B B B B C C D F
A continuación, utiliza uniq
para contar las líneas adyacentes:
$ cut -f1 grades | sort | uniq -c 3 A 4 B 2 C 1 D 1 F
A continuación, ordena las líneas en orden inverso, numéricamente, para desplazar el grado más frecuente a la línea superior:
$ cut -f1 grades | sort | uniq -c | sort -nr 4 B 3 A 2 C 1 F 1 D
y mantener sólo la primera línea con head
:
$ cut -f1 grades | sort | uniq -c | sort -nr | head -n1 4 B
Por último, como sólo quieres la letra de la nota, no el recuento, aísla la nota con cut
:
$ cut -f1 grades | sort | uniq -c | sort -nr | head -n1 | cut -c9 B
y ahí tienes la respuesta, gracias a una tubería de seis comandos, la más larga hasta ahora. Este tipo de construcción de canalizaciones paso a paso no es sólo un ejercicio educativo. Es cómo trabajan realmente los expertos en Linux. El Capítulo 8 está dedicado a esta técnica.
Detectar archivos duplicados
Combinemos lo que has aprendido con un ejemplo más amplio. Supón que estás en un directorio lleno de archivos JPEG y quieres saber si alguno está duplicado:
$ ls image001.jpg image005.jpg image009.jpg image013.jpg image017.jpg image002.jpg image006.jpg image010.jpg image014.jpg image018.jpg ⋮
Puedes responder a esta pregunta con un pipeline. Necesitarás otro comando, md5sum
, que examina el contenido de un archivo y calcula una cadena de 32 caracteres llamada unasuma de comprobación:
$ md5sum image001.jpg 146b163929b6533f02e91bdf21cb9563 image001.jpg
Por razones matemáticas, es muy probable que la suma de comprobación de un archivo sea única. Por tanto, si dos archivos tienen la misma suma de comprobación, es casi seguro que sean duplicados. Aquí, md5sum
indica que el primer y el tercer fichero son duplicados:
$ md5sum image001.jpg image002.jpg image003.jpg 146b163929b6533f02e91bdf21cb9563 image001.jpg 63da88b3ddde0843c94269638dfa6958 image002.jpg 146b163929b6533f02e91bdf21cb9563 image003.jpg
Las sumas de comprobación duplicadas son fáciles de detectar a simple vista cuando sólo hay tres archivos, pero ¿y si tienes tres mil? Son las tuberías al rescate. Calcula todas las sumas de comprobación, utiliza cut
para aislar los 32 primeros caracteres de cada línea y ordena las líneas para que los duplicados sean adyacentes:
$ md5sum *.jpg | cut -c1-32 | sort 1258012d57050ef6005739d0e6f6a257 146b163929b6533f02e91bdf21cb9563 146b163929b6533f02e91bdf21cb9563 17f339ed03733f402f74cf386209aeb3 ⋮
Ahora añade uniq
para contar las líneas repetidas:
$ md5sum *.jpg | cut -c1-32 | sort | uniq -c 1 1258012d57050ef6005739d0e6f6a257 2 146b163929b6533f02e91bdf21cb9563 1 17f339ed03733f402f74cf386209aeb3 ⋮
Si no hay duplicados, todos los recuentos producidos por uniq
serán 1. Ordena los resultados numéricamente de mayor a menor, y cualquier recuento mayor que 1 aparecerá en la parte superior de la salida:
$ md5sum *.jpg | cut -c1-32 | sort | uniq -c | sort -nr 3 f6464ed766daca87ba407aede21c8fcc 2 c7978522c58425f6af3f095ef1de1cd5 2 146b163929b6533f02e91bdf21cb9563 1 d8ad913044a51408ec1ed8a204ea9502 ⋮
Ahora vamos a eliminar los no duplicados. Sus sumas de comprobación van precedidas de seis espacios, el número uno y un solo espacio. Utilizaremos grep -v
para eliminar estas líneas:5
$ md5sum *.jpg | cut -c1-32 | sort | uniq -c | sort -nr | grep -v " 1 " 3 f6464ed766daca87ba407aede21c8fcc 2 c7978522c58425f6af3f095ef1de1cd5 2 146b163929b6533f02e91bdf21cb9563
Por último, tienes tu lista de sumas de comprobación duplicadas, ordenadas por el número de ocurrencias, producidas por una hermosa canalización de seis comandos. Si no produce ningún resultado, no hay archivos duplicados.
Este comando sería aún más útil si mostrara los nombres de los archivos duplicados, pero esa operación requiere funciones que aún no hemos discutido. (Las aprenderás en "Mejorar el detector de archivos duplicados".) Por ahora, identifica los archivos que tengan una suma de comprobación determinada buscando con grep
:
$ md5sum *.jpg | grep 146b163929b6533f02e91bdf21cb9563 146b163929b6533f02e91bdf21cb9563 image001.jpg 146b163929b6533f02e91bdf21cb9563 image003.jpg
y limpiando la salida con cut
:
$ md5sum *.jpg | grep 146b163929b6533f02e91bdf21cb9563 | cut -c35- image001.jpg image003.jpg
Resumen
Ya has visto el poder de stdin, stdout y las tuberías. Convierten un pequeño puñado de comandos en una colección de herramientas componibles, demostrando que el todo es mayor que la suma de las partes. Cualquiercomando que lea stdin o escriba stdout puede participar en tuberías.6 A medida que aprendas más comandos, podrás aplicar los conceptos generales de este capítulo para forjar tus propias y potentes combinaciones.
1 En los teclados estadounidenses, el símbolo de la pipa está en la misma tecla que la barra invertida (\
), normalmente situada entre las teclas Intro y Retroceso o entre la tecla Mayúsculas izquierda y la Z.
2 El estándar POSIX llama a esta forma de comando una utilidad.
3 Dependiendo de tu configuración, ls
también puede utilizar otras funciones de formato, como el color, al imprimir en pantalla pero no al redirigir.
4 Algunos sistemas Linux almacenan la información del usuario en otro lugar.
5 Técnicamente, no necesitas el sort -nr
final de esta cadena para aislar los duplicados, porque grep
elimina todos los no duplicados.
6 Algunos comandos no utilizan stdin/stdout y, por tanto, no pueden leer de las tuberías ni escribir en ellas. Algunos ejemplos son mv
y rm
. Sin embargo, las tuberías pueden incorporar estos comandos de otras formas; verás ejemplos en el Capítulo 8.
Get Linux eficiente en la línea de comandos now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.