GNU/Linux >> Tutoriales Linux >  >> Linux

Salida de comando de Linux como parámetro de otro comando

Esto es lo que quieres:

find . -name myFile -exec cp /home/myuser/myFile {} ';'

Un desglose/explicación de esto:

  • find :invocando el comando de búsqueda
  • . :iniciar la búsqueda desde el directorio de trabajo actual.
  • Dado que no se especifican indicadores de profundidad, esto buscará recursivamente todas las subcarpetas
  • -name myFile :encuentra archivos con el nombre explícito myFile
  • -exec :para los resultados de búsqueda, ejecute comandos adicionales con ellos
  • cp /home/myuser/myFile {} :copias /home/myuser/myFile para sobrescribir cada resultado devuelto por find a; piensa en {} como adónde va cada resultado de búsqueda.
  • ';' :se usa para separar diferentes comandos que se ejecutarán después de find

Hay un par de formas de resolver esto, dependiendo de si necesita preocuparse por los archivos con espacios u otros caracteres especiales en sus nombres.

Si ninguno de los nombres de archivo tiene espacios o caracteres especiales (constan solo de letras, números, guiones y guiones bajos), la siguiente es una solución simple que funcionará. Puedes usar $(command) para ejecutar un comando y sustituir los resultados en los argumentos de otro comando. El shell dividirá el resultado en espacios, tabulaciones o saltos de línea, y for asigna cada valor a $f a su vez, y ejecute el comando en cada valor.

for f in $(find . -name myFile)
do
    cp something $f
done

Si tiene espacios o tabulaciones, puede usar -exec de find opción. Pasas -exec command args , poniendo {} donde desea que se sustituya el nombre del archivo y termine los argumentos con un ; . Debe citar el {} y ; para que el shell no los interprete.

find . -name myFile -exec cp something "{}" \;

A veces -exec No es suficiente. Por ejemplo, en esta pregunta, querían usar la expansión de parámetros de Bash para calcular el nombre del archivo. Para hacerlo, debe pasar -exec bash -c 'your command' , pero luego se encontrará con problemas de cotización con el {} sustitución. Para resolver esto, puedes usar -print0 de find para imprimir los resultados delimitados con caracteres nulos (que no son válidos en los nombres de archivo) y canalizarlos a un while read bucle que divide parámetros en valores nulos:

find . -name myFile -print0 | (while read -d $'\0' f; do
    cp something "$f"
  done)

La tubería enviará la salida de un programa a la entrada de otro. cp no lee de su flujo de entrada en la terminal, simplemente usa los argumentos en la línea de comando.

Quieres usar xargs con la tubería o find de exec argumento en lugar de tuberías.

find . -name myFile 2>&1 | xargs -I {} cp /home/myuser/myFile {}

Nota:opción -I {} define {} como marcador de posición, también puede usar otro marcador de posición si entra en conflicto con el comando que se ejecutará.


Linux
  1. Cómo asignar la salida de un comando de Linux a una variable

  2. Cómo guardar la salida del comando en un archivo en Linux

  3. comando linux mv

  4. Linux du comando

  5. encontrar ejemplos de comandos en Linux

Comando Finger de Linux para encontrar detalles de usuario

Comando iftop en Linux

Comando lsblk en Linux

Cómo encontrar la dirección IP en la línea de comandos de Linux

Buscar comando en Linux/UNIX

Ejemplos de comandos echo de Linux