Shell 'tar: not found in archive' error when using regular expression

Когда я использую tar -xzf *.gz извлечь все .gz files in the current directory, I get Not found in archive ошибка. However, it works fine if I extract one by one or use a for-loop like

for file in `ls *.gz`; do tar -xzf $file; done

В чем причина этой ошибки?

3 ответа

Решение

Когда вы пишете:

tar -xf *.gz

tar команда видит (например):

tar -xf abc.tar.gz def.tar.gz ghi.tar.gz

Это интерпретируется как запрос на извлечение def.tar.gz а также ghi.tar.gz из архива abc.tar.gz, Поскольку файлов там нет, вы получите предупреждение.

Другими словами, tar работает на одном tar файл (возможно, сжатый) за один раз (за один вызов). Он не работает с несколькими файлами tar.

Обратите внимание, что если abc.tar.gz содержит файл pqr/xyz/important.cВы можете извлечь только один файл, указав:

tar -xf abc.tar.gz pqr/xyz/important.c

Используемая вами нотация является лишь вариантом этой нотации.

(И да, могут быть причины tar tar файл. Например, Gmail не позволяет вам отправлять tar-файл или gzipped tar-файл, который содержит исполняемый файл. Однако, если вы внедрили сжатый tar-файл в несжатый tar-файл, он не заглядывает во внутренний файл, чтобы найти исполняемый файл. Я использую это, когда мне нужно отправить файл tar с исполняемым файлом configure скрипт.)

Когда ты пишешь

 tar -xzf *.gz

ваша оболочка расширяет его до строки:

 tar -xzf 1.gz 2.gz 3.gz

(при условии, что 1.gz, 2.gz и 3.gz находятся в вашем текущем каталоге).

tar считает, что вы хотите извлечь 2.gz а также 3.gz от 1.gz; он не может найти эти файлы в архивах, и это вызывает сообщение об ошибке.

Вам нужно использовать цикл for командования xargs извлечь ваши файлы.

ls *.gz |xargs -n1 tar -xzf

Это значит: беги ко мне tar -xzf для каждого gz-файл в текущем каталоге.

Главная причина tar принимает один аргумент имени файла. Когда ты звонишь tar *.tgz Баш расширяет * ко всем именам файлов с помощью tgz formant и он становится tar file1 file2 file3 который не принят tar, Так что либо вы используете цикл как for i in *.tgz; do tar -zxvf $i ;done или используйте другую команду, которая выполняет tar как побочный эффект, как показано в комментариях, является ls или же find . -maxdepth 1 -name \*tgz -exec tar -zxvf {} \; (ls выход всегда рискованный)

Другие вопросы по тегам