-exec a xargs conversión en el comando de búsqueda
Estoy usando el siguiente comando en mi secuencia de comandos para realizar una dos2unixoperación en los archivos que copio de Windows a Linux. Hay muchos archivos, por lo que lleva una cantidad considerable de tiempo realizar esta operación.
Busqué en Internet para optimizar este hallazgo y descubrí que podemos usar xargscon en findlugar de -execaumentar el rendimiento, pero estoy luchando por convertir el siguiente para usar con xargs:
find /path_to_files/ -exec bash -c 'dos2unix -k -n "{}" tmp_file && mv tmp_file "{}"' \;
Respuestas
Cree un script ~/binpara procesar una lista de archivos, llámelo doit, que contenga
#!/bin/bash
while [[ $# -ne 0 ]] ; do thisfile="$1"
shift
dos2unix -k -n "$thisfile" tmp_file mv tmp_file "$thisfile"
done
Luego,
chmod +x ~/bin/doit
Y finalmente,
find /path/to/files -type f -print0 | \
xargs -0 -r $HOME/bin/doit
Leer man find xargs bash.
De hecho, es mucho más sencillo. No es necesario invocar un shell ni utilizarlo mvporque dos2unixya modifica el archivo de destino si no le da la -nbandera.
find /path_to_files -type f -exec dos2unix -k -q -- {} +
-type fde modo que buscar solo busca archivos normales, no directorios. -qSe le da la bandera a dos2unixpara que no escriba mensajes informativos en stdout. Y usamos en {} +lugar de {} \;para que find no invoque un dos2unixproceso por cada archivo encontrado, sino que proporcione tantos archivos como sea posible como argumentos ( dos2unix file1 file2 file3 ...).
Xargs sería solo un proceso adicional y, por lo tanto, una penalización de tiempo adicional. Evite invocar nuevos procesos siempre que pueda.