Для перенесення я не покладаюся на особливості sed, які є специфічними для Linux або BSD. Натомість я використовую overwrite
сценарій з книги Кернігана та Пайка про середовище програмування Unix.
Команда тоді
find /the/folder -type f -exec overwrite '{}' sed 's/old/new/g' {} ';'
І overwrite
сценарій (який я використовую всюди) є
#!/bin/sh
# overwrite: copy standard input to output after EOF
# (final version)
# set -x
case $# in
0|1) echo 'Usage: overwrite file cmd [args]' 1>&2; exit 2
esac
file=$1; shift
new=/tmp/$$.new; old=/tmp/$$.old
trap 'rm -f $new; exit 1' 1 2 15 # clean up files
if "$@" >$new # collect input
then
cp $file $old # save original file
trap 'trap "" 1 2 15; cp $old $file # ignore signals
rm -f $new $old; exit 1' 1 2 15 # during restore
cp $new $file
else
echo "overwrite: $1 failed, $file unchanged" 1>&2
exit 1
fi
rm -f $new $old
Ідея полягає в тому, що він перезаписує файл, лише якщо команда успішна. Корисно в, find
а також там, де ви не хочете використовувати
sed 's/old/new/g' file > file # THIS CODE DOES NOT WORK
оскільки оболонка усікає файл, перш ніж sed
зможе його прочитати.