如何解决在 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。