पोर्टेबिलिटी के लिए, मैं उन फीचर्स पर भरोसा नहीं करता, जो कि लिनक्स या बीएसडी के लिए विशिष्ट हैं। इसके बजाय मैं overwrite
यूनिक्स प्रोग्रामिंग पर्यावरण पर कर्निघन और पाइक की पुस्तक की स्क्रिप्ट का उपयोग करता हूं ।
आज्ञा तो है
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
को पढ़ने से पहले ही काट देता है।