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 comandols 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 headutilizando 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.