comando bash redirect xargs

bash - ¿Cómo usar> en un comando xargs?



xargs rm (3)

No cometa el error de hacer esto:

sh -c "grep ABC {} > {}.out"

Esto se romperá bajo muchas condiciones, incluyendo nombres de archivos originales y es imposible citar correctamente. Tu {} siempre debe ser un único argumento completamente separado del comando para evitar errores de inyección de código. Lo que debes hacer es esto:

xargs -I{} sh -c ''grep ABC "$1" > "$1.out"'' -- {}

Se aplica tanto a xargs como a find .

Por cierto, nunca use xargs sin la opción -0 (a menos que sea para uso interactivo muy raro y controlado de una sola vez en el que no esté preocupado por la destrucción de sus datos).

Tampoco analice ls . Nunca. Use globbing o find lugar:

Utilice find para todo lo que necesite recursión y un simple loop con un glob para todo lo demás:

find /foo -exec sh -c ''grep "$1" > "$1.out"'' -- {} /;

o no recursivo

for file in *; do grep "$file" > "$file.out"; done

Observe el uso correcto de las comillas.

Quiero encontrar un comando bash que me permita grep cada archivo en un directorio y escribir el resultado de ese grep en un archivo separado. Mi conjetura habría sido hacer algo como esto

ls -1 | xargs -I{} "grep ABC ''{}'' > ''{}''.out"

pero, hasta donde yo sé, a xargs no le gustan las comillas dobles. Sin embargo, si elimino las comillas dobles, el comando redirige la salida de todo el comando a un solo archivo llamado ''{}''. Out en lugar de a una serie de archivos individuales.

¿Alguien sabe de una manera de hacer esto usando xargs? Acabo de utilizar este escenario grep como ejemplo para ilustrar mi problema con xargs, por lo que las soluciones que no utilizan xargs no son aplicables para mí.


Supongo que su ejemplo es solo un ejemplo y que puede necesitar> para otras cosas. GNU Parallel http://www.gnu.org/software/parallel/ puede ser tu rescate. No necesita cotizaciones adicionales siempre que sus nombres de archivo no contengan / n:

ls | parallel "grep ABC {} > {}.out"

Si tiene nombres de archivo con / n en él:

find . -print0 | parallel -0 "grep ABC {} > {}.out"

Como bonificación adicional, los trabajos se ejecutan en paralelo.

Editar.

Puede instalar GNU Parallel simplemente por:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel chmod 755 parallel

Mira los videos introductorios para obtener más información: http://pi.dk/1

10 segundos de instalación:

wget pi.dk/3 -qO - | sh -x


Una solución sin xargs es la siguiente:

find . -mindepth 1 -maxdepth 1 -type f -exec sh -c "grep ABC ''{}'' > ''{}.out''" /;

... y lo mismo se puede hacer con xargs , resulta que:

ls -1 | xargs -I {} sh -c "grep ABC ''{}'' > ''{}.out''"

Editar : comillas simples agregadas después de la observación de lhunath .