截断文件的NULL字节

时间:2013-01-16 00:54:33

标签: file bash

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

生成的
truncate -s 8M <file>

如何切断零?

5 个答案:

答案 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)

如果文件是“文本”文件而不是“二进制”文件,则只需执行

即可
strings a.txt > b.txt

ref

答案 2 :(得分:0)

使用tr

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

请注意,$input_file$output_file必须不同

答案 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...