Ответ Мэтью Флэшена - хороший, однако у него есть пара недостатков.
- Нет проверки, что копирование прошло успешно, прежде чем исходный файл будет обрезан. Было бы лучше сделать все зависящее от успешной копии, либо проверить наличие временного файла, либо работать с ним. копия. Если вы человек с поясом и подтяжками, вы бы сделали комбо, как я иллюстрировал ниже
-
ls
не требуется.
- Я бы использовал лучшее имя переменной, чем "i" - возможно, "file".
Конечно, вы можете быть очень параноиком и проверять наличие временного файла в начале, чтобы вы случайно не перезаписали его и / или не использовали UUID или сгенерированное имя файла. Один из mktemp, tempfile или uuidgen справится с задачей.
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
Ловушки могут быть лучше, чем все отдельные обработчики ошибок, которые я добавил.
Без сомнения, все эти дополнительные предосторожности являются излишними для сценария с одним выстрелом, но эти методы могут спасти вас, когда наступает пуш, особенно в многофайловой операции.