【问题标题】:How to extract files using wildcards in specific sub-directory如何在特定子目录中使用通配符提取文件
【发布时间】:2021-01-14 11:12:05
【问题描述】:

我有一个包含以下内容的 tar 文件:

$ tar tvf ../mein.tar 
drwxr-xr-x user/user         0 2019-01-14 15:31 ./
drwxr-xr-x user/user         0 2019-01-14 15:30 ./dir2/
-rw-r--r-- user/user         0 2019-01-14 15:30 ./dir2/file21.jpg
-rw-r--r-- user/user         0 2019-01-14 15:29 ./file1.jpg
drwxr-xr-x user/user         0 2019-01-14 15:30 ./dir1/
drwxr-xr-x user/user         0 2019-01-14 15:30 ./dir1/dir11/
-rw-r--r-- user/user         0 2019-01-14 15:30 ./dir1/dir11/file111.jpg
-rw-r--r-- user/user         0 2019-01-14 15:30 ./dir1/dir11/file112.jpg
drwxr-xr-x user/user         0 2019-01-14 15:30 ./dir1/dir21/
-rw-r--r-- user/user         0 2019-01-14 15:30 ./dir1/dir21/file122.jpg
-rw-r--r-- user/user         0 2019-01-14 15:30 ./dir1/dir21/file121.jpg
-rw-r--r-- user/user         0 2019-01-14 15:30 ./dir1/file11.jpg

它包含几个可能包含也可能不包含 jpg 文件的子目录。文件名并不总是相同,但我知道目录 'dir1' 中只有一个 jpg 文件。我只想提取此文件,不提取其他 jpg 文件,既不在 dir2 也不在 dir1/dir* 中。

到目前为止我尝试过的是

$ tar -x -f ../mein.tar --wildcards 'dir1/*.jpg'
tar: dir1/*.jpg: Not found in archive
tar: Exiting with failure status due to previous errors

$ tar -x -f ../mein.tar --wildcards --wildcards-match-slash 'dir1/*.jpg'
tar: dir1/*.jpg: Not found in archive
tar: Exiting with failure status due to previous errors

如果我使用:

$ tar -x -f ../mein.tar --wildcards  "*.jpg"

然后我得到所有的jpg文件,这不是我想要的。

鉴于我不知道该文件的确切名称,是否有人知道如何在 dir1 中提取 jpg 文件?我期望在子目录 dir1 中得到一个文件,输出应该是 'dir1/file11.jpg'。

【问题讨论】:

  • 你试过'./dir1/*.jpg'而不是'dir1/*.jpg'吗?注意前面的./,如tar tf所示
  • 我的工作正常,只要我不引用它,即使我的相对路径找不到并展开文件名。
  • 这也不起作用:[vboxhain:/tmp/extract]$ tar -x -f ../mein.tar --wildcards './dir1/*.jpg' 创建后续文件 ./dir1/dir11/file111.jpg ./dir1/dir11/file112.jpg ./dir1/dir21/file122.jpg ./dir1/dir21/file121.jpg ./dir1/file11.jpg

标签: bash tar


【解决方案1】:

我将为您提供在 UNIX 时代使用的规范方式:

tar xf ../mein.tar `tar tf ../mein.tar|grep -E dir1/[a-zA-Z0-9]+.jpg$`

这将独立于 Linux 或 UNIX 以及 tar 的版本

这是我的测试:

[...] ➤ tar tvf ../tar.tar
drwxr-xr-x .......        0 2019-01-15 10:33:31 dir1/
drwxr-xr-x .......        0 2019-01-15 10:21:14 dir1/dir11/
-rw-r--r-- .......        0 2019-01-15 10:21:14 dir1/dir11/file111.jpg
-rw-r--r-- .......        0 2019-01-15 10:21:14 dir1/dir11/file112.jpg
drwxr-xr-x .......        0 2019-01-15 10:21:14 dir1/dir21/
-rw-r--r-- .......        0 2019-01-15 10:21:14 dir1/dir21/file121.jpg
-rw-r--r-- .......        0 2019-01-15 10:21:14 dir1/dir21/file122.jpg
-rw-r--r-- .......        0 2019-01-15 10:21:16 dir1/file11.jpg
drwxr-xr-x .......        0 2019-01-15 10:21:02 dir2/
-rw-r--r-- .......        0 2019-01-15 10:21:14 dir2/file21.jpg
-rw-r--r-- .......        0 2019-01-15 10:21:14 file1.jpg

[....] ➤ tar tf ../tar.tar|grep -E dir1/[a-zA-Z0-9]+.jpg$
dir1/file11.jpg

【讨论】:

  • 对不起,这不起作用,因为第二个 tar 没有产生任何输出。这个想法很好,但是 tar 文件的大小约为 26 GB,并且使用您的解决方案,我必须处理该文件两次,这需要很长时间。
  • 此 tar 产生所需的输出:tar tf ../mein.tar | sed -n -e '/[.][/]dir1[/][^/]*jpg/p'
  • @drhuh,请查看我更新的答案。恕我直言,如果您只想要一个文件,则很难避免重复浏览 tar 文件。
  • 是的,这应该可以,但使用tar tf 而不是tar tvf
【解决方案2】:

您需要像这样使用 --no-anchored

$ tar -xf ../mein.tar --wildcards --no-anchored  "dir1/*.jpg"

根据man page

文件名匹配选项

--anchored
    Patterns match file name start.

--no-anchored
    Patterns match after any / (default for exclusion).

--wildcards
    Use wildcards (default for exclusion).

--no-wildcards
    Verbatim string matching.

另见untar only a certain number of files from a large tarball

【讨论】:

    【解决方案3】:

    这行得通

    tar -xf mein.tar  dir1/*.jpg
    

    【讨论】:

    • 那不是对现有文件使用命令行通配符吗?如果本地不存在该文件,那么通配符会失效吗?
    • 这失败了:[vboxhain:/tmp/extract]$ tar -x -f ../mein.tar --wildcards dir1/*.jpg tar: dir1/*.jpg: Not found in archive tar: Exiting with failure status due to previous errors
    • [vboxhain:/tmp/extract]$ tar -x -f ../mein.tar dir1/*.jpg tar: Pattern matching characters used in file names tar: Use --wildcards to enable pattern matching, or --no-wildcards to suppress this warning tar: dir1/*.jpg: Not found in archive tar: Exiting with failure status due to previous errors
    • 你的 tar 版本是什么?
    • 我的 Ubuntu 16.04 LTS 带有以下 tar:[vboxhain:/tmp/extract]$ tar --version tar (GNU tar) 1.28
    猜你喜欢
    • 2013-10-26
    • 2023-03-09
    • 2012-11-28
    • 2018-04-03
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    相关资源
    最近更新 更多