我有大约500个具有尾随NUL字节的文件,可能是用
生成的truncate -s 8M <file>
如何切断零?
答案 0 :(得分:2)
这个perl脚本应该这样做:
for f in *; do
perl -e '$/=undef;$_=<>;s|\0+$||;print;' < $f > $f_fixed
done
这会将所有NUL保留在文件中,最后删除任何NUL,并将结果保存到<original filename>_fixed
。
脚本说明:$/=undef
告诉perl对整个文件进行操作而不是将其拆分为行; $_=<>
加载文件; s|\0+||
删除加载文件'string'末尾的任何NUL字符串;并print
输出结果。其余的是标准的Bash文件重定向。
答案 1 :(得分:0)
答案 2 :(得分:0)
答案 3 :(得分:0)
根据@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
答案 4 :(得分:0)
对于这种特殊情况,并不是真正的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...