如何将字符串添加到返回多行的 bash 命令的每一行,例如 du 或 ls -l

如何将字符串添加到返回多行的 bash 命令的每一行,例如 du 或 ls -l

我想为某些目录创建一个内容文件,该文件应存储在多个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 的替换运算符,将替换第一次出现oldnew。该符号$与行尾匹配,因此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 仅在有多个输入文件时才这样做)

相关内容