W zależności od sposobu utworzenia pliku zip, czasami wyodrębnia on wszystkie pliki bezpośrednio, a czasem wyodrębnia pliki do podkatalogu.
Jeśli to ostatnie jest prawdą, jak mogę zmusić unzip
polecenie do „zignorowania” tego katalogu pierwszego poziomu?
Przykład:
cd /tmp
wget http://omeka.org/files/omeka-1.5.1.zip
mkdir omeka
unzip omeka-1.5.1.zip -d omeka/
cd omeka/
ll
Dostaję to /tmp/omeka/omeka-1.5.1/
:
total 12
drwxr-xr-x 3 root root 4096 2012-05-08 18:44 ./
drwxrwxrwt 6 root root 4096 2012-05-08 18:44 ../
drwxr-xr-x 5 root root 4096 2012-04-20 14:54 omeka-1.5.1/
Chcę, aby pliki zostały wyodrębnione /tmp/omeka/
(jeden poziom wyżej i brak struktury wersji w strukturze katalogów)
/tmp/omeka/(files)
Wiem, że mogę użyć -j
opcji „śmieciowych ścieżek”, ale chcę zachować strukturę podkatalogów, a nie strukturę katalogów najwyższego poziomu. W jaki sposób mogę to zrobić?
mv
pliki, ale chciałem sprawdzić, czy istnieje sposób, aby to zrobić od razu za pomocą polecenia unzip/wordpress/
katalogu (bez numeru wersji) w pliku zip. To jest rzeczywiście grzywnyunzip
i potemmv
, ale nie mając kontrolę nad tym i mając to zrobić w dwóch etapach zawsze zdobyć na moje nerwy trochę. Na szczęście Wordpress również.tar.gz
cd /tmp/omeka && ln -s -T . omeka-1.5.1
Odpowiedzi:
Użyj systemu plików FUSE, który umożliwia przeglądanie archiwów takich jak katalogi, takie jak AVFS . Użyj,
cp
aby wyodrębnić pliki do wybranego katalogu.Ponieważ zakładamy, że w archiwum znajduje się jeden katalog najwyższego poziomu, możesz go skrócić
źródło
unzip
że mam na to trochę magii, jak na przykład określenie plików do wyodrębnienia*/*
, których mogę użyć bez instalowania innego narzędzia, ale chyba nie. Dzięki. +1Jeśli plik zip nie zawiera struktury katalogów lub nie musisz go zachowywać, możesz użyć tego:
źródło
Ten skrypt nie jest niezawodny, ale działa w prostych przypadkach:
Sprawdza tylko, czy jest dokładnie jeden podkatalog, a jeśli tak, przenosi wszystko z niego, a następnie usuwa.
źródło
Właśnie się zarejestrowałem dzisiaj, więc nie mogę głosować za odpowiedzią @SteveBennet i nie mogę tam dodać komentarza.
Na podstawie jego odpowiedzi stworzyłem funkcję rekurencyjną:
Tak jak powiedział @SteveBennet: ten skrypt nie jest niezawodny, ale działa w prostych przypadkach.
Mam nadzieję, że to się przyda.
źródło
Potrzebujesz wygląda jak
patch --strip=n
opcjaPożądane byłoby posiadanie opcji takiej jak
patch --strip=number
(lub-pnumber
), która odcinanumber
komponenty ścieżki na początku (zob. Porównywanie i scalanie plików: katalogi łatek ).Inne rozwiązanie, zastosowanie
W przeciwnym razie istnieje inne rozwiązanie, trochę hackerskie, ale działa. W moim przypadku chciałem zastąpić katalog pełen istniejących plików zawartością zip, bez uprzedniego rozpakowania całego zip.
Gdy to rozwiązanie zadziała, a rozwiązanie @ Gilles będzie dostępne, to drugie również będzie działać. Jednak to rozwiązanie nie wymaga dostępności systemu plików FUSE.
Jak to zrobić
Zakładając, że znasz dodatkowy katalog, w twoim przypadku
omeka-1.5.1
możesz to zrobić:unzip
spróbuje rozpakować, doomeka-1.5.1
którego w rzeczywistości jest dowiązanie symboliczne do zawierającego katalog. W rezultacie pliki trafiąomeka
bezpośrednio.Możliwe warianty
Możesz wyobrazić sobie warianty przekierowujące jedną lub więcej części hierarchii depeer.
Wniosek
To rozwiązanie jest dość specyficzne, ale ma swoje przypadki użycia i właśnie z niego skorzystałem.
źródło
unzip -l
. Za pomocą . Można to nawet zautomatyzować za pomocą skryptu, który określa część wspólnej ścieżki.zipinfo -1
może być dobry początek. Jaki jest twój przypadek użycia?Najprawdopodobniej chcesz uruchomić
unzip
z tą-j
opcją, jak w:Ale możesz być zaskoczony jego zachowaniem:
Jeśli wypakujesz
files.zip
do katalogu wyjściowego,./output
a otrzymasz:wtedy
-j
opcja da ci to (wszystkie ścieżki w paski):źródło