从文件中截断NUL字节



我有大约500个带有尾NUL字节的文件,可能是用

生成的
truncate -s 8M <file>

如何截断0 ?

这个perl脚本应该这样做:

for f in *; do
    perl -e '$/=undef;$_=<>;s|+$||;print;' < $f > $f_fixed
done

这将保留文件中的所有null,并在最后删除任何null,并将结果保存到<original filename>_fixed

脚本说明:$/=undef告诉perl对整个文件进行操作,而不是将其分成几行;$_=<>加载文件;s|+||删除加载文件'string'末尾的任何null字符串;print输出结果。其余部分是标准的Bash文件重定向。

如果文件是"文本"文件而不是"二进制"文件,您可以简单地执行

strings a.txt > b.txt

ref

使用tr:

cat $input_file | tr -d '' > $output_file

注意$input_file$output_file必须不同

按照@Eevee的建议,实际上可以避免截断那些小于8M的文件。在循环中使用以下条件,并且如果不向size参数附加任何后缀,truncate将假定字节为默认值,这将不会将文件填充到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

对于这种特殊情况并不是任何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''))
运行:

python retruncate.py file1 file2 files* etc...

相关内容

  • 没有找到相关文章

最新更新