我有大约 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