bash find xargs

bash - xargs: sustitución de variables después de la redirección



xargs rm (5)

¿Qué tal un bucle for como:

for file in `find . -name ''*.txt'' | xargs grep ''iso-8859-1'' | cut -d '':'' -f1`; do iconv -f ISO-8859-1 -t UTF-8 $file > $file.converted done

Estoy tratando de encontrar todos los archivos de texto que tienen la codificación iso-8859-1 y convertirlos a UTF-8. Mi intento hasta ahora es:

find . -name ''*.txt'' | xargs grep ''iso-8859-1'' | cut -d '':'' -f1 | xargs iconv -f ISO-8859-1 -t UTF-8 {} > {}.converted

El problema (obvio) es que la última sustitución de variable no funcionará, ya que {} ocurre después de la redirección y no pertenece a xargs . Como solo obtengo un archivo llamado {}.converted , no a.txt.converted , b.txt.converted , etc. ¿Cómo puedo hacer que esto funcione?

Nota: Estoy haciendo esto en Cygwin, donde iconv no parece ser compatible con -o .


Suponiendo que ninguno de sus archivos tiene caracteres de nueva línea en el nombre, y suponiendo que tiene GNU find y xargs ::

find . -name ''*.txt'' -print0 | xargs -0 grep -l ''iso-8859-1'' | while read -r file; do iconv -f ISO-8859-1 -t UTF-8 "$file" > "$file".converted done

Con grep -l , no necesita el comando de cut en la tubería.


Ya casi has llegado:

find . -name ''*.txt'' | xargs grep -i iso-8859-1 | cut -f1 -d: | / xargs -I% echo iconv -f l1 -t utf8 % /> %.utf | bash


Si tienes GNU Parallel http://www.gnu.org/software/parallel/ instalado, puedes hacer esto:

find . -name ''*.txt'' | parallel grep -il iso-8859-1 | parallel iconv -f ISO-8859-1 -t UTF-8 {} /> {}.converted

Puede instalar GNU Parallel simplemente por:

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

Mira los videos introductorios de GNU Parallel para obtener más información: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1


Repita el comando en el que desea que xargs opere en una cadena que se canaliza al shell y que superará el problema de sustitución.

find . -name ''*.txt'' | xargs grep ''iso-8859-1'' | cut -d '':'' -f1 | xargs echo "iconv -f ISO-8859-1 -t UTF-8 {} > {}.converted" | bash