GNU/Linux >> Tutoriales Linux >  >> Linux

busque y copie todas las imágenes en el directorio usando terminal linux mint, tratando de entender la sintaxis

Primero, comprenda que la tubería "|" los comandos de enlaces canalizan la salida del primero al segundo como un argumento. Sus dos códigos de shell canalizan la salida del comando de búsqueda a otros comandos (grep y xargs). Veamos esos comandos uno tras otro:

Primer comando:buscar

find es un programa para "buscar archivos en una jerarquía de directorios" (esa es la explicación de la página de manual de find). La sintaxis es (en este caso)

find <search directory> <search pattern> <action>

En ambos casos el directorio de búsqueda es . (ese es el directorio actual). Tenga en cuenta que no solo busca en el directorio actual, sino también en todos sus subdirectorios (la jerarquía de directorios).

El patrón de búsqueda acepta las opciones -name (lo que significa que busca archivos cuyo nombre coincida con el patrón dado como argumento para esta opción) o -iname (igual que el nombre pero no distingue entre mayúsculas y minúsculas), entre otras.

El patrón de acción puede ser -print0 (imprime el nombre de archivo exacto, incluida su posición en el directorio de búsqueda dado, es decir, la ruta relativa o absoluta al archivo) o -exec (ejecuta el comando dado en el archivo o archivos), el comando es terminará con ";" y cada instancia de "{}" se reemplazará por el nombre del archivo).

Es decir, el primer código de shell (primera parte, a la izquierda de la tubería)

find . -iname \*.jpg -print0 

busca todos los archivos que terminan en ".jpg" en la jerarquía de directorios actual e imprime sus rutas y nombres. El segundo (primera parte)

find . -name '*' -exec file {} \; 

encuentra todos los archivos en la jerarquía de directorios actual y los ejecuta

file <filename>

en ellos. Archivo es otro comando que determina e imprime el tipo de archivo (eche un vistazo a la página de manual para obtener más detalles, archivo de manual).

Segundo comando:xargs

xargs es un comando que "construye y ejecuta líneas de comando desde la entrada estándar" (man xargs), es decir, desde la salida de búsqueda que se canaliza a xargs. El comando que construye y ejecuta es en este caso

cp -v {} /home/joachim/neu2"

La opción -I{} define la cadena de reemplazo, es decir, cada instancia de {} en el comando debe ser reemplazada por la entrada que obtiene del archivo (es decir, los nombres de archivo). La opción -0 define que los elementos de entrada no terminan (separados) por espacios en blanco o líneas nuevas, sino solo por un carácter nulo. Esto parece ser necesario cuando se usa y la forma estándar de tratar con la salida de búsqueda como entrada xargs.

El comando que se compila y ejecuta es, por supuesto, el comando de copia con la opción -v (detallado) y copia cada uno de los nombres de archivo que obtiene de la búsqueda en el directorio.

Tercer comando:grep

grep filtra su entrada dando solo aquellas líneas o cadenas que coinciden con un patrón de salida particular. La opción -o le dice a grep que imprima solo la cadena coincidente, no la línea completa (ver man grep), -P le dice que interprete el siguiente patrón como un patrón perl regexp. En perl regex, ^ es el comienzo de la línea, .+ es cualquier cadena arbitraria, esta arbitraria debe ir seguida de dos puntos, un espacio, una cantidad de caracteres alfanuméricos (en perl regex denotados como \w+), un espacio y la cadena "imagen". Esencialmente, este comando grep filtra la salida del archivo para generar solo los nombres de archivo que son archivos de imagen. (Lea sobre perl regex, por ejemplo, aquí:http://www.comp.leeds.ac.uk/Perl/matching.html )

El comando que realmente querías

Ahora lo que quiere hacer es (1) tomar la salida del segundo comando de shell (que enumera los archivos de imagen), (2) ponerlo en la forma adecuada y (3) canalizarlo al comando xargs desde el primer comando de shell línea (que luego construye y ejecuta el comando de copia que desea). Entonces, esta vez tenemos un comando de shell de tres (en realidad cuatro) etapas con dos conductos. No es un problema. Ya tenemos las etapas (1) y (3) (aunque en la etapa (3) debemos omitir la opción -0 porque la entrada ya no encuentra la salida; la necesitamos para tratar las nuevas líneas como separadores de elementos).

Aún falta la etapa (2). Sugiero usar el comando de corte para esto. cut cambia las cadenas y las divide en diferentes campos (separados por un carácter delimitador en la cadena original) que luego se pueden reorganizar. Elegiré ":" como el carácter delimitador (esto finaliza el nombre del archivo en la salida grep, opción -d':') y le diré que nos proporcione solo el primer campo (opción -f1, esencial:imprima solo el nombre del archivo, no la parte que viene después del ":"), es decir, la etapa (2) sería

cut -d':' -f1

Y el comando completo que querías será:

find . -name '*' -exec file {} \; | grep -o -P '^.+: \w+ image' | cut -d':' -f1 | xargs -I{} cp -v {} /home/joachim/neu2

Tenga en cuenta que puede encontrar todas las páginas man, por ejemplo, aquí:http://www.linuxmanpages.com


Linux
  1. Cambiar el nombre de todos los archivos y nombres de directorios a minúsculas en Linux

  2. Cómo encontrar y copiar cierto tipo de archivos de un directorio a otro en Linux

  3. ¿Cómo eliminar un directorio y una carpeta en Linux?

  4. buscar y copiar archivos usando Bash

  5. Encontrar un directorio en una terminal de Linux

Todo sobre archivos tar y cómo tar, untar archivos en Linux usando Terminal

Cómo encontrar la contraseña WiFi guardada en Linux Mint usando GUI o terminal

Tutorial sobre el uso del último comando en la terminal de Linux

50 ejemplos simples y útiles del comando Buscar en Linux

El comando find Directory de Linux:Explicación

Usando cut en Linux Terminal