如何将 grep 结果传递给变量,以便我可以将它与 exec tar 命令一起使用?

Dev*_*vWL 0 grep tar pipe exec

我试图根据一些正则表达式压缩目录中的所有文件夹,所以我使用 grep 过滤掉输出,现在我需要使用 tar 和文件夹名称。

例如我想 .tar.gz 每个顶级目录到它自己的存档。目录名称必须以“web_”开头,不能以“.tar.gz”结尾。

如何将 grep 输出捕获到变量,使其看起来像这样:

find . -maxdepth 1 -mindepth 1 -type d -print | grep -v \.tar\.gz$ | grep ^\./web_ | exec tar -czf $name.tar.gz $name
Run Code Online (Sandbox Code Playgroud)

或使用 ls -h

ls -h | grep -v \.tar\.gz$ | grep ^web_ | exec tar -czf $name.tar.gz $name
Run Code Online (Sandbox Code Playgroud)

选择“查找...”:

root@4a94aef49e3a:/home# find . -maxdepth 1 -mindepth 1 -type d -print | grep -v \.tar\.gz$ | grep ^web_
./web_demozip1
./web_demozip2
Run Code Online (Sandbox Code Playgroud)

选择“ls -h”:

root@4a94aef49e3a:/home# ls -h | grep -v \.tar\.gz$ | grep ^web_
web_demozip1
web_demozip2
Run Code Online (Sandbox Code Playgroud)

例子:

# fixed name works but its overwrite itself so I need to catch a var from grep
ls -h | grep -v \.tar\.gz | grep ^_web | exec tar -czf web_demozip1.tar.gz web_demozip1

root@4a94aef49e3a:/home# pwd
/home
root@4a94aef49e3a:/home# tree .
.
??? web_demozip1
?   ??? somefile.txt
??? web_demozip1.tar.gz
??? web_demozip2
    ??? somefile.txt
Run Code Online (Sandbox Code Playgroud)

pLu*_*umo 5

您不需要find使用过滤结果grep。使用过滤器功能find代替。

find . -maxdepth 1 -mindepth 1 -type d \
  -name 'web_*' \
  -exec tar czf {}.tar.gz {} \;
Run Code Online (Sandbox Code Playgroud)

find也可以使用 过滤regex,但您的示例不需要它。看这里怎么做。