如何在特定子目录中使用通配符提取文件
How to extract files using wildcards in specific sub-directory
我有一个包含以下内容的 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 文件的 none,既不在 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'.
这个有效
tar -xf mein.tar dir1/*.jpg
我会提供给你规范的方式,用在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
您需要像这样使用--no-anchored
:
$ tar -xf ../mein.tar --wildcards --no-anchored "dir1/*.jpg"
根据 man page:
File name matching options
<b>--anchored</b>
Patterns match file name start.
<b>--no-anchored</b>
Patterns match after any / (default for exclusion).
<b>--wildcards</b>
Use wildcards (default for exclusion).
<b>--no-wildcards</b>
Verbatim string matching.
另见 untar only a certain number of files from a large tarball
我有一个包含以下内容的 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 文件的 none,既不在 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'.
这个有效
tar -xf mein.tar dir1/*.jpg
我会提供给你规范的方式,用在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
您需要像这样使用--no-anchored
:
$ tar -xf ../mein.tar --wildcards --no-anchored "dir1/*.jpg"
根据 man page:
File name matching options
<b>--anchored</b> Patterns match file name start. <b>--no-anchored</b> Patterns match after any / (default for exclusion). <b>--wildcards</b> Use wildcards (default for exclusion). <b>--no-wildcards</b> Verbatim string matching.
另见 untar only a certain number of files from a large tarball