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