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