ejemplos - lista completa de comandos linux pdf
encuentre y copie todas las imágenes en el directorio usando terminal linux mint, tratando de entender la sintaxis (3)
Descubrí un comando que solo usa awk y que también hace el trabajo:
find . -name ''*'' -exec file {} /; |
awk ''{
if ($3=="image"){
print substr($1, 0, length($1)-1);
system("cp " substr($1, 0, length($1)-1) " /home/joachim/neu2" )
}
}''
el substr ($ 1, 0, length ($ 1) -1) es necesario porque en la primera columna el archivo devuelve el nombre;
OS Linux Mint
Al igual que el título dice finalmente, me gustaría encontrar y copiar todas las imágenes en un directorio.
Encontré:
encuentre todos los archivos jpg (o JPG) en el directorio y cópielos en la carpeta / home / joachim / neu2:
find . -iname /*.jpg -print0 | xargs -I{} -0 cp -v {} /home/joachim/neu2
y
encuentre todos los archivos de imagen en el directorio:
find . -name ''*'' -exec file {} /; | grep -o -P ''^.+: /w+ image''
Mi problema es antes que nada, realmente no entiendo la sintaxis. ¿Alguien podría explicar el código?
Y en segundo lugar, ¿alguien puede conectar los dos códigos para generar un código que hace lo que quiero;)
¡Saludos y gracias de antemano!
Y de nuevo, una explicación del código sería muy útil.
La respuesta anterior es realmente buena. pero podría tomar más tiempo si es un gran directorio. aquí hay una versión más corta, si ya conoce su extensión de archivo
find . -name /*.jpg | cut -d'':'' -f1 | xargs -I{} cp --parents -v {} ~/testimage/
Primero, entiende que la tubería "|" Enlaces comandos que conectan la salida de la primera en el segundo como un argumento. Sus dos códigos de shell canalizan la salida del comando find a otros comandos (grep y xargs). Miremos esos comandos uno después de otro:
Primer comando: encontrar
find es un programa para "buscar archivos en una jerarquía de directorios" (esa es la explicación de la página man 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 del directorio).
El patrón de búsqueda acepta opciones -name (lo que significa que busca archivos cuyo nombre coincida con el patrón dado como argumento para esta opción) o -imame (igual que el nombre pero distingue entre mayúsculas y minúsculas), entre otros.
El patrón de acción puede ser -print0 (imprimir el nombre de archivo exacto incluyendo su posición en el directorio de búsqueda dado, es decir, la ruta relativa o absoluta al archivo) o -exec (ejecutar el comando dado en el archivo (s), el comando es terminar con ";" y cada instancia de "{}" se reemplaza con 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 con la terminación ".jpg" en la jerarquía del directorio actual e imprime sus rutas y nombres. El segundo (primera parte)
find . -name ''*'' -exec file {} /;
encuentra todos los archivos en la jerarquía del directorio actual y ejecuta
file <filename>
en ellos. File es otro comando que determina e imprime el tipo de archivo (eche un vistazo a la página man para más detalles, archivo man).
Segundo comando: xargs
xargs es un comando que "crea 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 están terminados (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 lidiar con la salida de resultados como entrada xargs.
El comando que se genera y ejecuta es, por supuesto, el comando de copia con la opción -v (verbose) y copia cada uno de los nombres de archivo que se obtiene de find 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 correspondiente, no toda la línea (ver man grep), -P le dice que interprete el siguiente patrón como un patrón perl regexp. En perl regex, ^ es el inicio de la línea,. + Es cualquier cadena arbitraria, este arbitrario debe ser seguido por dos puntos, un espacio, una serie de caracteres alfanuméricos (en perl regex denotado / w +) un espacio y la cadena "imagen". Esencialmente, este comando grep filtra la salida del archivo para solo generar los nombres de archivo que son archivos de imagen. (Lea acerca de 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 el resultado del segundo comando de shell (que enumera los archivos de imagen), (2) ponerlo en la forma adecuada y (3) canalizarlo en el comando xargs desde el primer comando de shell línea (que luego compila y ejecuta el comando de copia que desea). Así que esta vez tenemos un comando de shell de tres etapas (en realidad cuatro) con dos tubos. No es un problema. Ya tenemos las etapas (1) y (3) (aunque en la etapa (3) necesitamos dejar de lado la opción -0 porque la entrada ya no se encuentra en la salida, necesitamos tratar las nuevas líneas como separadores de elementos).
La etapa (2) sigue desaparecida. Sugiero usar el comando de corte para esto. cortar cambia las cadenas py dividiéndolas 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 termina el nombre de archivo en la salida grep, opción -d '':'') y le digo que nos dé solo el primer campo (opción -f1, essentialls: imprima solo el nombre del archivo, no la parte que viene después del ":"), es decir, la etapa (2) sería entonces
cut -d'':'' -f1
Y el comando completo que desea será entonces:
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