我有百万4-20 KB文件的目录(可以产生类似的这样的文件:seq 10000 | gzip > a; seq 1000000 | parallel --bar 'head -c{=$_=int(rand()*16)+4=}k a > {}'
)
. 我需要复制那个目录。但似乎我必须为每个文件做一个搜索,所以这需要很长时间。
有什么方法可以加快速度吗?
我目前在想,如果我能得到这些文件占用的磁盘块,我可以对它们进行排序,合并接近的块(鉴于顺序读取通常比寻找更快)并读取这些块,以便它们在 RAM 中在进行复制之前缓存(我有 32 GB RAM)。
但是为了让它工作,我需要一种方法来识别文件所在的块。
我在磁性设备(即不是 SSD)上使用 EXT4。
编辑:
这应该有效,但它没有:
ls |
parallel -IOO --pipe "sudo parallel -j100 hdparm --fibmap {}'|tail -n +5'" |
sort -nk 2 |
perl -ane 'if($u+10000 < $F[1]) { print "$l ",($u-$l),"\n"; $l=$F[1] } $u=$F[2]' |
sudo parallel --colsep ' ' dd if=/dev/sda1 skip={1} bs=512 count={2} '| cat >/dev/null'
Run Code Online (Sandbox Code Playgroud)
在大文件上测试时,它不会缓存文件。
编辑2: …
我已登录到 Sun Solaris OS。我想创建并提取一个压缩的 tar 文件。我试过这个普通的 UNIX 命令:
tar -cvzf file.tar.gz directory1
Run Code Online (Sandbox Code Playgroud)
在 Sun OS 中执行失败并出现以下错误
bash-3.2$ tar -cvzf file.tar.tz directory1
tar: z: unknown function modifier
Usage: tar {c|r|t|u|x}[BDeEFhilmnopPqTvw@[0-7]][bfk][X...] [blocksize] [tarfile] [size] [exclude-file...] {file | -I include-file | -C directory file}...
Run Code Online (Sandbox Code Playgroud)