Pregunta:
Tengo un problema extremo y todas las soluciones que puedo imaginar son complicadas. Según mi experiencia con UNIX / Linux, debe haber una manera fácil.
Quiero eliminar los primeros 31 bytes de cada archivo en /foo/
. Cada archivo es lo suficientemente largo. Bueno, estoy seguro de que alguien me ofrecerá una solución sorprendentemente fácil que no puedo imaginar. ¿Quizás awk?
Respuesta:
for file in /foo/*
do
if [ -f "$file" ]
then
dd if="$file" of="$file.truncated" bs=31 skip=1 && mv "$file.truncated" "$file"
fi
done
o más rápido, gracias a la sugerencia de Gilles:
for file in /foo/*
do
if [ -f $file ]
then
tail +32c $file > $file.truncated && mv $file.truncated $file
fi
done
Nota: La cola de Posix especifica "-c +32" en lugar de "+ 32c", pero la cola predeterminada de Solaris no le gusta:
$ /usr/bin/tail -c +32 /tmp/foo > /tmp/foo1
tail: cannot open input
/usr/xpg4/bin/tail
está bien con ambas sintaxis.
Si desea conservar los permisos del archivo original, reemplace
... && mv "$file.truncated" "$file"
por
... && cat "$file.truncated" "$file" && rm "$file.truncated"