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 sh
funció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.sh
cada 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.sh
tiene 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
, $2
etc. ( $0
generalmente contiene el nombre del script). En su caso, $1
contendrá 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 find
archivos y pasa sus nombres, xargs
surge el problema con los nombres de archivos extraños que las personas tienden a recordar entre sí, y lo haré aquí también.
La find
utilidad 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 xargs
invocar su secuencia de comandos con nombres adecuados.
Por lo tanto, es una buena prácticasiempreuse -print0
with find
y -0
with xargs
, lo que significa que los nombres de los archivos, en lugar de estar separados por espacios, están separados por nul
caracteres ( \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.sh
esté en tu directorio de trabajo.
find . -name 'segment*' -print0| xargs -0 -n1 -P4 ./someFunction.sh
El -print0
y -0
permite archivos con espacios en el nombre (un problema común). en mi someFunction.sh
tengo
#!/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