Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 截断文件中的NUL字节_File_Bash - Fatal编程技术网

File 截断文件中的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将假定字节为默认值,这将不会填充

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

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