1

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

truncate -s 8M <file>

我怎样才能切断零?

4

5 回答 5

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+||删除加载文件“字符串”末尾的任何 NUL 字符串;并print输出结果。其余的是标准 Bash 文件重定向。

于 2013-01-16T01:59:04.703 回答
0

如果文件是“文本”文件而不是“二进制”文件,你可以简单地做

strings a.txt > b.txt

参考

于 2013-01-16T01:17:38.287 回答
0

使用tr

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

注意$input_file$output_file必须不同

于 2013-01-16T01:32:30.573 回答
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...
于 2013-01-16T01:55:54.943 回答
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
于 2013-01-16T01:40:37.750 回答