извлечение tar зависит от имени файла?

33

Я часто скачиваю архивы с wget с sourceforge.net.

Загруженные файлы затем называются, например, SQliteManager-1.2.4.tar.gz?r=http:%2F%2Fsourceforge.net%2Fprojects%2Fsqlitemanager%2Ffiles%2F&ts=1305711521&use_mirror=switch

Когда я пытаюсь

tar xzf SQliteManager-1.2.4.tar.gz\?r\=http\:%2F%2Fsourceforge.net%2Fprojects%2Fsqlitemanager%2Ffiles%2F\&ts\=1305711521\&use_mirror\=switch

Я получаю следующее сообщение об ошибке:

tar (child): Cannot connect to SQliteManager-1.2.4.tar.gz?r=http: resolve failed

gzip: stdin: unexpected end of file
tar: Child returned status 128
tar: Error is not recoverable: exiting now

После переименования файла для foo.tar.gzизвлечения работает отлично.

Есть ли способ, что я не вынужден переименовывать каждый раз целевой файл перед извлечением?

Casper
источник

Ответы:

50

Причину ошибки, которую вы видите, можно найти в документации по GNU tar :

Если имя файла архива включает двоеточие (':'), то предполагается, что это файл на другом компьютере [...]

Таким образом, оно интерпретируется SQliteManager-1.2.4.tar.gz?r=httpкак имя хоста и пытается преобразовать его в IP-адрес, поэтому возникает ошибка «решить не удалось».

Эта же документация продолжает:

Если вам нужно использовать файл, имя которого включает двоеточие, то поведение удаленного ленточного накопителя можно запретить с помощью параметра --force-local.

CAMH
источник
Обратите внимание, что --force-localэто должно быть добавлено до f... когда я впервые попробовал это, он выдавал мне сообщение об ошибке о том, что такого файла нет --force-local. Может быть, это слишком "нет дух", но я не признал ошибку, которую я сделал, до 5 минут спустя.
ArtOfWarfare
@ArtOfWarfare: fпринимает аргумент, который является tarfile. Вы не можете поставить --force-localмежду fаргументом и его аргументом, но это стандартно для всех программ, не только tarи не только -f. Вы можете поставить --force-localпосле того, fкак это также после аргумента f.
Camh
Как я уже сказал в своем комментарии, может быть, это слишком «не дух». Я использую tar, как это, tar -cvzf ...и даже не думаю о том, что каждый флаг делает в 99% случаев - просто рефлексия, что именно так я и создаю tar.gz.
ArtOfWarfare
На этой заметке, чтобы быть более полезным в отношении того, что эти двое (@ArtOfWarfare и @camh) говорят здесь, приведем пример: tar zxvf C:\Users\jdoe\Documents\tarfile.tgz --force-local
Д-р Дэн
6

При загрузке с помощью wgetукажите имя выходного файла с -Oпараметром.

wget "http://domain.com/file.tgz?crazy=args&stuff=todelete" -O file.tgz

Это приведет к сохранению файла с указанным именем файла и избавит вас от хлопот или переименования. И нет, вы не единственный, кто хочет, чтобы sourcefourge не был настолько глуп, чтобы раздавать файлы с прикрепленными параметрами url.

Калеб
источник
Это не ошибка SourceForge, но wgetэто. Используйте --content-dispositionфлаг для сохранения с указанным сервером именем файла (но остерегайтесь последствий для безопасности, поскольку SourceForge может затем записать произвольное имя файла).
pcworld
4

Скачать с помощью

wget --trust-server-names URL

Таким образом, wget будет сохранять правильные имена файлов. По умолчанию он использует последний компонент в URL

Например,

wget --trust-server-names http://sourceforge.net/projects/sqlitemanager/files/sqlitemanager/1.2.4/SQliteManager-1.2.4.tar.gz/download
вольнодумцем
источник
4

Как указано выше, :(столбец) заставляет tarдумать, что это удаленный файл. Таким образом, мы должны обеспечить факт, что это локально.

Провал

$ tar czf "back$(date -u +"%H:%M").tar.gz" ./
tar (child): Cannot connect to back10: resolve failed
tar: Child returned status 128
tar: Error is not recoverable: exiting now

Решение

Объясните тот факт, что это локальный файл, добавив ./(текущий каталог) и правильно указав в кавычках:

$ tar czf ./"back$(date -u +'%H:%M').tar.gz" ./
tar: .: file changed as we read it

Предупреждение связано с тем, что я создаю в исходном каталоге.

Эдуард Лопес
источник
Намного лучше, чем использовать длинный флаг. Также я считаю, что удаленная загрузка хоста - бесполезная опция, в то время как для этой цели есть специальные инструменты.
Алиреза Мохамади
3

Для уже загруженных файлов это должно работать:

tar xzf - < SQliteManager-1.2.4.tar.gz*
jlliagre
источник