如何通过通配符仅压缩指定文件?

如何通过通配符仅压缩指定文件?

我只想压缩指定的文件。我努力了:

$ ls $des/bin
a.c           analysis.hpp  classify.hpp  main.cpp   split.hpp
a.cpp         a.out         grade.cpp     main.out   student.cpp
analysis.cpp  classify.cpp  grade.hpp     split.cpp  student.hpp
$ cd /
$ tar czf ~/files.tgz -C $des/bin '*.cpp' '*.hpp'

给予

tar: *.cpp: Cannot stat: No such file or directory
tar: *.hpp: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

--wildcards没有帮助

$ tar czf ~/files.tgz -C $des/bin --wildcards '*.{c,h}pp' 
tar: *.{c,h}pp: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

如何-C在 tar 中更改的目录(通过 )中使用通配符?

答案1

glob 由 shell 扩展。tar(至少某些tar实现)支持通配符,但仅用于过滤要从存档中提取或列出的文件。

因此,文件列表需要由 shell 生成,如果您需要存储在存档中的文件名不包含目录部分,则需要tar删除它(有些有-s--transform选项),或者简单地cd进入生成文件列表之前的目录。

要将输出存档保留在原始工作目录中,您可以使用重定向并仅更改子 shell 中的目录,如下所示:

(cd -P -- "$des/bin" && tar -zcvf - -- *.[hc]pp) > files.tar.gz

或者您可以在更改当前工作目录之前记录该目录:

(dir=$PWD; cd -P -- "$des/bin" && tar -zcvf "$dir/files.tar.fz" -- *.[hc]pp)

答案2

怎么样:

$ tar czf ~/files.tgz -T <(\ls -1 $des/bin/*.{c,h}pp)

tar将标志后的文件内容-T视为要压缩的文件,一行。这适用于 GNU tar1.32。

<(cmd)其中cmd代表 的语法\ls -1 $des/bin/*.{c,h}pp称为流程替代(请参阅 参考资料man bash获取更多信息)。

编辑:如果您需要在 tar 球中不完全限定文件名(不包括其绝对路径),只需cd在运行命令之前到所需的目录tar...

$ cd $des/bin; tar czf ~/files.tgz -T <(\ls -1 *.{c,h}pp)

请注意,使用标志指定感兴趣的目录-C

$ tar czf ~/files.tgz -C $des/bin -T <(\ls -1 *.{c,h}pp)

不起作用。尽管该-C标志是顺序敏感的,即它影响后面的所有标志,但它不适用于所示的进程替换。

答案3

macOS 11

tar -C my_forder_with_files -czvf example.tar.gz  -T <(ls -1 my_forder_with_files | grep -E '(\.log|\.txt)$')

输出“example.tar.gz”

a app.txt
a app 2.txt
a url.log
a urls 2.log

相关内容