File 截断文件中的NUL字节
我有大约500个尾随NUL字节的文件,可能是用File 截断文件中的NUL字节,file,bash,File,Bash,我有大约500个尾随NUL字节的文件,可能是用 truncate -s 8M <file> truncate-s 如何删除零?如果文件是“文本”文件而不是“二进制”文件,您只需执行以下操作即可 strings a.txt>b.txt 使用: 请注意,$input\u file和$output\u file必须不同根据@Eevee的建议,实际上可以避免截断8M以下的文件。在循环中使用以下条件,并且如果不在size参数中添加任何后缀,truncate将假定字节为默认值,这将不会填充
truncate -s 8M <file>
truncate-s
如何删除零?如果文件是“文本”文件而不是“二进制”文件,您只需执行以下操作即可
strings a.txt>b.txt
使用:
请注意,
$input\u file
和$output\u file
必须不同根据@Eevee的建议,实际上可以避免截断8M以下的文件。在循环中使用以下条件,并且如果不在size参数中添加任何后缀,truncate
将假定字节为默认值,这将不会填充8M以下的文件:
$(ls-c1目录)中文件的;做
# ...
大小=$(统计-c%s$文件)
限额=$((8*1024*1024))
如果[“$SIZE”-lt“$LIMIT”];然后
截断-s$SIZE$文件
其他的
截断-s 8M$文件
fi
# ...
完成
对于这种特殊情况,实际上没有任何Unix工具。下面是一个Python(3)脚本:
运行方式:
python retruncate.py file1 file2 files* etc...
这个perl脚本应该可以做到这一点:
for f in *; do
perl -e '$/=undef;$_=<>;s|\0+$||;print;' < $f > $f_fixed
done
用于f in*;做
perl-e'$/=unde;$=];s |\0+$| |;打印;'<$f>$f_固定
完成
这将保留文件中的所有NUL,删除最后的任何NUL,并将结果保存到\u fixed
脚本说明:
$/=unde
告诉perl对整个文件进行操作,而不是将其拆分成行$\uU9=
加载文件s |\0+| |
删除加载文件“string”末尾的任何NUL字符串;然后,print
输出结果。剩下的是标准的Bash文件重定向。您是指ASCII字符零(0
)还是NUL字节?后者听起来更像是从截断(二进制)文件中得到的。文件是否有NUL字节,因为您使用了truncate
,将较短的文件填充到所需的大小?也许真正的答案是不要在小于8M的文件上使用它:)@Eevee不,我下载了那些文件。这也删除了不在文件末尾的NUL字节。啊,说得好,我(错误地)假设这些是文本文件。
python retruncate.py file1 file2 files* etc...
for f in *; do
perl -e '$/=undef;$_=<>;s|\0+$||;print;' < $f > $f_fixed
done