Answers:
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
还是更快,这要感谢吉尔斯的建议:
for file in /foo/*
do
if [ -f $file ]
then
tail +32c $file > $file.truncated && mv $file.truncated $file
fi
done
注意:Posix尾部指定“ -c +32”而不是“ + 32c”,但是Solaris默认尾部不喜欢它:
$ /usr/bin/tail -c +32 /tmp/foo > /tmp/foo1
tail: cannot open input
/usr/xpg4/bin/tail
两种语法都很好。
dd
此处建议过度矫kill,tail
更恰当(更简单,更容易出现错字错误,stderr上没有虚假消息)。
cut
(那不是尾巴吗?... asis,它对我不起作用...
/usr/xpg4/bin
领先/usr/bin
于PATH
,否则您将陷于1990年代初期。许多unice(例如GNU,BusyBox)不再支持历史+32c
语法,而是将其表示为一个名为的文件+32c
(如POSIX要求)。
以下命令从$file
($file~
用作临时副本)剪切前31个字节:
dd if="$file" of="$file~" bs=1 skip=31
mv "$file~" "$file"
您只需要列出下面的find
文件或所有文件,/foo/
并对$file
发现的每个文件执行上面的两个文件。
tail -c +32
输出其输入减去前31个字节。(是的,自变量不存在。)要在适当位置编辑文件,请在循环中使用海绵,或者如果您没有文件又不想打扰,请在外壳中执行其工作:
for x in /foo/*; do tail -c +32 "$x" | sponge "$x"; done
for x in /foo/*; do tail -c +32 "$x" >"$x.new" && mv "$x.new" "$x"; done
如果命令由于任何原因(例如电源故障)而中断,则可能很难弄清中断的位置。将新文件写入单独的目录将使事情变得容易。
mkdir /foo.tmp
cd /foo
for x in *; do tail -c +42 -- "$x" >"/foo.tmp/$x" && rm -- "$x"; done
mv /foo.tmp/* /foo
rmdir /foo.tmp
如果文件确实很大(例如,足够大以至于即使只有一个副本都有两个副本都是一个问题),则可以使用此线程中提到的一种技术。