我想为某些目录创建一个内容文件,该文件应存储在多个tar
档案中。我用
du --all currentdir >> contents.list
为了那个原因。
我想在将其写入文件之前将存档的名称附加tar
到输出的每一行。du
我想我可以这样做:
du --all currentdir | while read i; do echo "$i mytar" >> contents.list ; done
我怀疑存在更简单的解决方案,但我是 bash 脚本新手。
答案1
为此使用 while 循环会非常慢。如果您只想在每行末尾添加静态字符串,请改用sed
:
du --all | sed 's/$/ myArchive.tar/'
或者,如果您想在变量中包含存档名称(例如$i
):
du --all | sed "s/$/ $i/"
s/old/new/
是 sed 的替换运算符,将替换第一次出现old
的new
。该符号$
与行尾匹配,因此s/$/foo/
只会添加foo
到每行的末尾。
答案2
通常,对于我想对输入列表执行操作的情况,特别是如果该操作非常简单,我会选择使用xargs
;在这种情况下,我会选择这样的东西:
du --all currentdir | xargs -I{} echo "{} mytar" >> contents.list
xargs
通常已被证明具有相当高的性能,并且我认为它更具可读性(不需要记住各种正则表达式符号的重要性,这些符号在实现之间可能有所不同,并且并不总是直观的。)
答案3
du
为此使用是错误的方法。相反,一旦创建了 tar 文件,只需用于tar tv
列出其内容即可。例如
for f in *.tar.gz; do
tar tvfz "$f" > "$f.list"
done
这将为每个 tar.gz 文件创建一个 .list 文件。如果您想创建一个综合列表,您可以使用grep
.例如
grep -H . *.tar.gz.list > contents.list
该模式.
匹配任何内容,并且该-H
选项告诉 grep 在其输出中添加文件名和冒号前缀,即使只有一个输入文件名(默认情况下,grep 仅在有多个输入文件时才这样做)