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
выход всегда рискованный)