Как извлечь файлы с использованием подстановочных знаков в конкретном подкаталоге - PullRequest
0 голосов
/ 14 января 2019

У меня есть tar-файл со следующим содержимым:

[vboxhain:/tmp/extract]$ 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 *.

То, что я пробовал до сих пор, это

[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 --wildcards --wildcards-match-slash '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 --wildcards  "*.jpg"

тогда я получаю все файлы jpg, это не то, что я хочу.

Кто-нибудь знает, как извлечь файл jpg в dir1, учитывая, что я не знаю точное имя этого файла? Я ожидаю получить ровно один файл в подкаталоге dir1, вывод должен быть 'dir1 / file11.jpg'.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Я предложу вам канонический способ, используемый во времена 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
0 голосов
/ 14 января 2019

Это работает

tar -xf mein.tar  dir1/*.jpg
...