khai thác tar phụ thuộc vào tên tập tin?


33

Tôi thường tải tarball với wget từ sourceforge.net.

Các tập tin tải xuống sau đó được đặt tên, ví dụ SQliteManager-1.2.4.tar.gz?r=http:%2F%2Fsourceforge.net%2Fprojects%2Fsqlitemanager%2Ffiles%2F&ts=1305711521&use_mirror=switch

Khi tôi cố gắng

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

Tôi nhận được thông báo lỗi sau:

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

Sau khi đổi tên tập tin thành foo.tar.gztrích xuất hoạt động hoàn hảo.

Có cách nào mà tôi không bị buộc phải đổi tên mỗi lần tệp đích trước khi giải nén không?

Câu trả lời:


50

Lý do cho lỗi bạn đang thấy có thể được tìm thấy trong tài liệu tar của GNU :

Nếu tên tệp lưu trữ bao gồm dấu hai chấm (':'), thì nó được coi là một tệp trên máy khác [...]

Đó là, nó được hiểu SQliteManager-1.2.4.tar.gz?r=httplà tên máy chủ lưu trữ và cố gắng giải quyết nó thành địa chỉ IP, do đó lỗi "giải quyết không thành công".

Tài liệu tương tự tiếp tục nói:

Nếu bạn cần sử dụng một tệp có tên bao gồm dấu hai chấm, thì hành vi ổ băng từ xa có thể bị ức chế bằng cách sử dụng tùy chọn '--force-local'.


Lưu ý rằng --force-localphải được thêm vào trước f... khi tôi thử lần đầu tiên, nó đã cho tôi một thông báo lỗi về việc không có tệp nào như vậy --force-local. Có lẽ điều này là quá "không duh" nhưng tôi đã không nhận ra sai lầm mà tôi đã gây ra cho đến 5 phút sau.
ArtOfWarfare

@ArtOfWarfare: flấy một đối số là tarfile. Bạn không thể đặt --force-localgiữa fđối số và đối số của nó, nhưng đó là tiêu chuẩn cho tất cả các chương trình, không chỉ tarvà không chỉ -f. Bạn có thể đặt --force-localsau fmiễn là nó cũng sau khi đối số f.
camh

Giống như tôi đã nói trong nhận xét của mình, có lẽ đó cũng là quá no no duh. Tôi sử dụng tar như thế này tar -cvzf ...và thậm chí không nghĩ về những gì mỗi lá cờ thực sự 99% thời gian - đó chỉ là phản xạ đó là cách tôi tạo ra một tar.gz.
ArtOfWarfare

Về lưu ý này, để hữu ích hơn về những gì hai người này (@ArtOfWarfare và @camh) đang nói ở đây là một ví dụ: tar zxvf C:\Users\jdoe\Documents\tarfile.tgz --force-local
Tiến sĩ Dan

6

Khi bạn tải xuống wget, chỉ định tên tệp đầu ra với -Otùy chọn.

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

Điều này sẽ khiến tập tin lưu với tên tệp đã cho và giúp bạn tránh những rắc rối hoặc đổi tên nó. Và không, bạn không phải là người duy nhất mong muốn sourcefourge sẽ không bị câm như vậy khi phát ra các tệp có tham số url được đính kèm.


Đây không phải là lỗi của SourceForge, nhưng wgetlà. Sử dụng --content-dispositioncờ để lưu với tên tệp do máy chủ chỉ định (nhưng hãy cẩn thận với ý nghĩa bảo mật, vì SourceForge sau đó có thể ghi vào tên tệp tùy ý).
pcworld

4

Tải xuống bằng

wget --trust-server-names URL

Bằng cách đó, wget sẽ lưu với tên tệp chính xác. Theo mặc định, nó sử dụng thành phần cuối cùng trong URL

Ví dụ

wget --trust-server-names http://sourceforge.net/projects/sqlitemanager/files/sqlitemanager/1.2.4/SQliteManager-1.2.4.tar.gz/download

4

Như được trích dẫn ở trên, :(cột) tarnghĩ rằng đó là một tệp từ xa. Vì vậy, chúng ta cần phải thực thi nó là địa phương.

Thất bại

$ 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

Dung dịch

Giải thích thực tế đó là một tệp cục bộ bằng cách nối thêm ./(thư mục hiện tại) và trích dẫn chính xác:

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

Cảnh báo là do thực tế tôi đang tạo trong thư mục nguồn.


Tốt hơn nhiều so với việc sử dụng một lá cờ dài. Ngoài ra tôi tin rằng tải xuống máy chủ từ xa là tùy chọn vô dụng trong khi có các công cụ cụ thể để đạt được mục đích này.
Alireza Mohamadi

3

Đối với các tệp đã tải xuống, điều này sẽ hoạt động:

tar xzf - < SQliteManager-1.2.4.tar.gz*
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.