видобуток смоли залежить від назви файла?


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вилучення працює ідеально.

Чи є спосіб, що я не змушений перейменовувати кожен раз цільовий файл перед вилученням?

Відповіді:


50

Причину помилки, яку ви бачите, можна знайти в документації GNU tar :

Якщо ім'я файлу архіву містить двокрапку (':'), то воно передбачається, що це файл на іншій машині [...]

Тобто вона інтерпретується SQliteManager-1.2.4.tar.gz?r=httpяк ім'я хоста і намагається вирішити його на IP-адресу, отже, помилка "вирішити не вдалося".

Ця сама документація продовжує говорити:

Якщо вам потрібно скористатися файлом, ім'я якого містить двокрапку, то поведінку віддаленої стрічки можна призупинити, скориставшись опцією '--force-local'.


Зауважте, що --force-localпотрібно додати f... коли я вперше спробував це, він дав мені повідомлення про помилку про те, як немає такого файлу як --force-local. Можливо, це занадто "немає духу", але я не визнав помилки, яку допустив до 5 хвилин пізніше.
ArtOfWarfare

@ArtOfWarfare: fприймає аргумент, який є tarfile. Ви не можете розміщувати --force-localміж fаргументом і його аргументом, але це стандартно для всіх програм, не тільки tarі не просто -f. Ви можете ставити --force-localпісля того f, як це буде також після аргументу до f.
camh

як я сказав у своєму коментарі, можливо, це занадто "ні духу". Я використовую тар так, як 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*
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.