de Matthew Flaschen es una buena idea, sin embargo, tiene un par de defectos.
- No hay comprobación de que la copia tuvo éxito antes de que se trunque el archivo original. Sería mejor hacer que todo dependa de una copia exitosa, o probar la existencia del archivo temporal, o para operar en la copia. Si eres un tipo de persona con cinturón y tirantes, harías un combo como lo he ilustrado a continuación
- El
ls
es innecesario.
- Usaría un nombre de variable mejor que "i", quizás "archivo".
Por supuesto, usted podría ser muy paranoico y comprobar la existencia del archivo temporal al principio para que no accidentalmente sobreescribe y/o el uso de un UUID o un nombre de archivo generado. Uno de mktemp, tempfile o uuidgen haría el truco.
td=TMPDIR
export TMPDIR=
usertemp=~/temp # set this to use a temp directory on the same filesystem
# you could use ./temp to ensure that it's one the same one
# you can use mktemp -d to create the dir instead of mkdir
if [[ ! -d $usertemp ]] # if this user temp directory doesn't exist
then # then create it, unless you can't
mkdir $usertemp || export TMPDIR=$td # if you can't create it and TMPDIR is/was
fi # empty then mktemp automatically falls
# back to /tmp
for file in *.sql
do
# TMPDIR if set overrides the argument to -p
temp=$(mktemp -p $usertemp) || { echo "$0: Unable to create temp file."; exit 1; }
{ printf '\xFF\xFE' > "$temp" &&
cat "$file" >> "$temp"; } || { echo "$0: Write failed on $file"; exit 1; }
{ rm "$file" &&
mv "$temp" "$file"; } || { echo "$0: Replacement failed for $file; exit 1; }
done
export TMPDIR=$td
Las trampas pueden ser mejores que todos los manejadores de errores que he agregado.
Sin duda, toda esta precaución adicional es excesiva para un script de un solo intento, pero estas técnicas pueden ahorrarle cuando se trata de empujar, especialmente en una operación de varios archivos.
printf! Gracias amigo, creo que habría estado buscando en Google hasta el final de los tiempos. –
El punto de código BOM es U + FEFF pero su representación literal en UTF-8 es 'EF BB BF' (tres bytes). Esto solo funcionaría si el archivo ya estaba en UTF-16, orden little endian. Ver http://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding – pimlottc