我只想压缩指定的文件。我努力了:
$ 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 tar
1.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