¿Pasar el archivo de entrada a través de la tubería como argumento?

¿Pasar el archivo de entrada a través de la tubería como argumento?

Tengo dos problemas. Estoy intentando pasar archivos a través de una tubería como argumento y estoy intentando usar ese archivo como una variable dentro de la shfunción.

Aquí está mi comando:

find . -name 'segment*' | xargs -n1 -P4 sh someFunction.sh

Aquí, mi línea busca todos los archivos que se parecen a " segment.something" y los pasa al lado derecho de la tubería. En someFunction.sh, necesito el nombre del archivo como argumento. Digamos que el archivo que se ingresa en segment1.

Imprimirá someFunction.shcada línea de segment1(por ejemplo).

¿Cómo paso la salida del lado izquierdo de la tubería al lado derecho y luego cómo la llamo dentro someFunction.sh?

Respuesta1

tu comando

$ find . -name 'segment*' | xargs -n1 -P4 sh someFunction.sh

someFunction.shtiene el efecto de que se iniciarán como máximo cuatro copias del script de shell ( -P 4) en paralelo (las nuevas se generarán tan pronto como se completen las antiguas), y cada una tendrá un nombre de archivo como argumento ( -n 1).

Esto significa que cada invocación de su script se verá así

sh someFunction.sh segmentsomething

Dentro del script, el shell pondrá los valores delparámetros posicionales(los argumentos en la línea de comando) en $1, $2etc. ( $0generalmente contiene el nombre del script). En su caso, $1contendrá el nombre del archivo y los demás estarán vacíos.

Entonces, en el guión:

filename="$1"

echo "$filename"
cat "$filename"

Eso es eso. Ahora, generalmente cuando uno busca findarchivos y pasa sus nombres, xargssurge el problema con los nombres de archivos extraños que las personas tienden a recordar entre sí, y lo haré aquí también.

La findutilidad pasa nombres de archivos separados por espacios en blanco. Eso no es bueno si tiene nombres de archivos con espacios, ya que eso causaría problemas para xargsinvocar su secuencia de comandos con nombres adecuados.

Por lo tanto, es una buena prácticasiempreuse -print0with findy -0with xargs, lo que significa que los nombres de los archivos, en lugar de estar separados por espacios, están separados por nulcaracteres ( \0). Esto lo hace mucho más seguro.

De este modo:

$ find . -name 'segment*' -print0 | xargs -0 -n1 -P4 sh someFunction.sh

Respuesta2

Podrías usar algo como esto suponiendo que someFunction.shesté en tu directorio de trabajo.

find . -name 'segment*' -print0| xargs -0 -n1 -P4 ./someFunction.sh 

El -print0y -0permite archivos con espacios en el nombre (un problema común). en mi someFunction.shtengo

#!/bin/bash
echo "Arg: " $1  
cat $1

Lo que simplemente hace eco del nombre del archivo y luego escribe el contenido del archivo pasado asomeFunction.sh

información relacionada