2012-01-24 8 views
5

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:xargs: sustitución de variables después de la redirección

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

El (obvio) problema es que la última sustitución de variables no funcionará, ya que {} se produce después de que el cambio de direcció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.

+0

Por favor, eche un vistazo a esta [pregunta relacionada] (http://stackoverflow.com/q/845863/183066). – jcollado

+0

No sé qué respuesta aceptar. Las respuestas de e.dan y glenn son las más pragmáticas, pero Ole Tanges es la más estéticamente agradable. chorobas también es bastante agradable. Tienes que pensar sobre eso. –

Respuesta

3

Si tiene GNU paralelo http://www.gnu.org/software/parallel/ instalado se puede hacer esto:

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

Puede instalar en paralelo GNU 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

1

¿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 
+0

¿Cómo manejará su solución el archivo: los 12 registros de "mi hermano": enumerados a-> z.txt?? –

1

Suponiendo que ninguno de sus archivos tienen caracteres de nueva línea en el nombre, y suponiendo que tiene GNU encontrar 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 cut en la tubería.

0

Usted está casi allí:

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

¿Cómo se ocupará su solución del archivo: los 12 registros de "mi hermano" ?: enumerados a-> z.txt ¿? –

0

repita el comando que desea que xargs opere en una cadena que se canaliza al shell y que solucionará 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 
Cuestiones relacionadas