ekstrakcja smoły zależy od nazwy pliku?

33

Często ściągam tarballe za pomocą wget ze sourceforge.net.

Pobrane pliki są następnie nazywane, np SQliteManager-1.2.4.tar.gz?r=http:%2F%2Fsourceforge.net%2Fprojects%2Fsqlitemanager%2Ffiles%2F&ts=1305711521&use_mirror=switch

Kiedy próbuję

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

Otrzymuję następujący komunikat o błędzie:

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

Po zmianie nazwy pliku foo.tar.gzna ekstrakcję działa idealnie.

Czy istnieje sposób, że nie muszę zmieniać nazwy za każdym razem, gdy plik docelowy zostanie rozpakowany?

Casper
źródło

Odpowiedzi:

50

Powód tego błędu można znaleźć w dokumentacji tar GNU :

Jeśli nazwa pliku archiwum zawiera dwukropek („:”), zakłada się, że jest to plik na innym komputerze [...]

Oznacza to, że interpretuje SQliteManager-1.2.4.tar.gz?r=httpjako nazwę hosta i próbuje przekształcić go w adres IP, stąd błąd „nie powiodło się”.

Ta sama dokumentacja mówi dalej:

Jeśli potrzebujesz użyć pliku, którego nazwa zawiera dwukropek, zachowanie zdalnego napędu taśm można zatrzymać, używając opcji --force-local.

camh
źródło
Uwaga, która --force-localmusi zostać dodana przed f... kiedy po raz pierwszy spróbowałem, wyświetlał mi komunikat o błędzie dotyczący braku takiego pliku jak --force-local. Może to zbyt „no duh”, ale nie rozpoznałem błędu, który popełniłem dopiero 5 minut później.
ArtOfWarfare
@ArtOfWarfare: fprzyjmuje argument, który jest plikiem tar . Nie można umieścić argumentu --force-localmiędzy fi, ale jest to standard dla wszystkich programów, nie tylko tari nie tylko -f. Możesz wstawić --force-localpo ftak długo, jak jest to również po argumencie do f.
camh
jak powiedziałem w moim komentarzu, może to zbyt „no duh”. Używam tar w ten sposób tar -cvzf ...i nawet nie myślę o tym, co każda flaga robi w 99% przypadków - to jest po prostu refleksyjne, że tak robię tar.gz.
ArtOfWarfare
W tej notatce, aby być bardziej pomocnym w tym, co mówią ci dwaj (@ArtOfWarfare i @camh), jest przykład: tar zxvf C:\Users\jdoe\Documents\tarfile.tgz --force-local
Dr Dan
6

Podczas pobierania za pomocą opcji wgetokreśl nazwę pliku wyjściowego -O.

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

Spowoduje to zapisanie pliku z podaną nazwą pliku i zaoszczędzenie kłopotów lub zmiany jego nazwy. I nie, nie jesteś jedynym, który życzy sobie, aby sourcefourge nie był tak głupi, aby rozdawać pliki z dołączonymi parametrami adresu URL.

Caleb
źródło
To nie jest wina SourceForge, ale wgetjest. Użyj --content-dispositionflagi, aby zapisać z nazwą pliku podaną przez serwer (ale uważaj na konsekwencje dla bezpieczeństwa, ponieważ SourceForge może następnie zapisać do dowolnej nazwy pliku).
pcworld,
4

Pobierz za pomocą

wget --trust-server-names URL

W ten sposób wget zapisze poprawne nazwy plików. Domyślnie używa ostatniego składnika w adresie URL

Na przykład

wget --trust-server-names http://sourceforge.net/projects/sqlitemanager/files/sqlitemanager/1.2.4/SQliteManager-1.2.4.tar.gz/download
wolno-myśliciel
źródło
4

Jak wspomniano powyżej, :(kolumna) sprawia tar, że jest to plik zdalny. Musimy więc egzekwować fakt, że jest lokalny.

Zawieść

$ 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

Rozwiązanie

Wyjaśnij, że jest to plik lokalny, dodając ./(bieżący katalog) i poprawnie cytując:

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

Ostrzeżenie wynika z faktu, że tworzę w katalogu źródłowym.

Édouard Lopez
źródło
O wiele lepsze niż używanie długiej flagi. Również uważam, że zdalne pobieranie hosta jest bezużyteczną opcją, podczas gdy istnieją specjalne narzędzia do osiągnięcia tego celu.
Alireza Mohamadi
3

W przypadku już pobranych plików powinno to działać:

tar xzf - < SQliteManager-1.2.4.tar.gz*
jlliagre
źródło