我有大约 500 个带有尾随 NUL 字节的文件,可能是用
truncate -s 8M <file>
我怎样才能切断零?
这个 perl 脚本应该这样做:
for f in *; do
perl -e '$/=undef;$_=<>;s|\0+$||;print;' < $f > $f_fixed
done
这会将所有 NUL 保留在文件中,最后删除任何 NUL,并将结果保存到<original filename>_fixed
.
脚本解释: $/=undef
告诉perl对整个文件进行操作,而不是把它分成几行;$_=<>
加载文件;s|\0+||
删除加载文件“字符串”末尾的任何 NUL 字符串;并print
输出结果。其余的是标准 Bash 文件重定向。
对于这种特殊情况,实际上没有任何 Unix 工具。这是一个 Python (3) 脚本:
import sys
for fn in sys.argv[1:]:
with open(fn, 'rb') as f:
contents = f.read()
with open(fn, 'wb') as f:
f.write(contents.rstrip(b'\0'))
运行为:
python retruncate.py file1 file2 files* etc...
按照@Eevee 的建议,您实际上可以避免截断8M 以下的文件。在您的循环中使用以下条件,并且truncate
如果您不将任何后缀附加到 size 参数,将假定字节为默认值,这不会填充 8M 以下的文件:
for file in $(ls -c1 directory); do
# ...
SIZE=$(stat -c%s $file)
LIMIT=$((8 * 1024 * 1024))
if [ "$SIZE" -lt "$LIMIT" ]; then
truncate -s $SIZE $file
else
truncate -s 8M $file
fi
# ...
done