【发布时间】:2020-12-14 04:32:58
【问题描述】:
我正在使用bsdtar 将包含许多(数百万)xml 文件的.tar.gz 文件的内容通过管道传输到标准输出。
目前我使用的命令是:
$ bsdtar -x -f <file.tar.gz> -O | ...
在下游程序(上述命令中的省略号)中,我需要将输出流分块到每个文件中。我已经阅读了 bsdtar 的手册页,但还是看不到指定文件分隔符字节。
目前我正在使用这个 rust 代码。这只有效,因为每个文件都有相同的 XML 声明行(我丢弃)。
struct FileIter<'a> {
buf_reader: StdinLock<'a>
}
impl FileIter<'_> {
fn next_file<'a>(&mut self, buf: &'a mut Vec<u8>) -> Option<&'a [u8]> {
buf.clear();
loop {
match self.buf_reader.read_until(b'?', buf) {
// This is the file deliminator
// <?xml version="1.0" encoding="UTF-8"?>\n
Ok(0) => { break None; }
Ok(_) => {
let buf_len = buf.len();
if buf_len >= 37 {
if &buf[buf_len - 37..buf_len] ==
b"<?xml version=\"1.0\" encoding=\"UTF-8\"?" {
buf.truncate(buf_len - 37);
if buf.len() > 2 {
break Some(&buf[2..]);
}
}
}
}
Err(err) => {
println!("{:?}", err);
break None;
}
}
}
}
}
bsdtar 中是否有指定文件分隔符字节的选项?或者是否有一种更通用的方法可以在 Rust 中适用于所有文件?
【问题讨论】:
-
您是否考虑过使用 Rust 原生库来代替?喜欢crates.io/crates/tar
-
其实我没有!这是一个如此明显的答案,我只是达到了我所知道的。谢谢!