在 bash 的循环中从文本文件中读取多行

问题描述

我正在尝试用 bash 编写存档程序脚本,但文件太多。它们实在是太多了……大约有 100 万个文件

我计划好了,我将创建文件列表;

cd /path/to/log/directory/
find . -type f > logfilelist.txt 

然后,我将使用 tar 和 zip 压缩它们;

tar -cvf logarchive.tar $(cat logfilelist.txt) 
gzip logarchive.tar

但是,由于从 cat 返回的行太多,tar 给出“Arg list too long”错误

所以我认为,如果我可以循环读取文件,我可以使用 tar 的附加模式逐个归档它们。但是制作百万行循环是不合逻辑的。那么,我可以像这样读取多行列表文件吗;

tar -cf logarchive.tar $(first 50000 lines of logfilelist.txt) 

for loop
do
tar -rvf logarchive.tar $(2nd,3rd,...,99th,100th 50000 lines of logfilelist.txt)  
done

是否可以从文件中捕获多行?

解决方法

您可以使用 mapfile 来轻松读取行并在每个 N 之后调用函数:

#!/bin/bash
archive() {
  tar -rvf logarchive.tar "${lines[@]}"
  lines=()
}
mapfile -t -c 50000 -C archive lines < logfilelist.txt
archive # Also call it for the last <50,000 lines

PS:这是一个 XYProblem 来代替“如何将大量文件从列表添加到 tar 存档?”,而对此的答案反而更容易和更好>

tar -cf logarchive.tar --files-from logfilelist.txt 
,

你使用 xargs。 此脚本按行添加 tar 存档。

# append and create tar.
cat logfilelist.txt | xargs -n 1 -I {} tar -rvf logarchive.tar {}
# gzip tar achive.
gzip logarchive.tar