Mam skrypt, który wyodrębnia plik tar.gz do określonego podkatalogu mysubfolder :
mkdir mysubfolder; tar --extract --file=sourcefile.tar.gz --strip-components=1 --directory=mysubfolder;
Czy istnieje równoważny sposób na zrobienie tego za pomocą pliku zip?
Odpowiedzi:
Jak powiedział Mathias,
unzip
nie ma takiej opcji, ale skrypt bash z jedną linią może to zrobić.Problem polega na tym: najlepsze podejście zależy od układu archiwum. Rozwiązanie, które zakłada, że jeden katalog najwyższego poziomu zawiedzie, jeśli zawartość znajdzie się bezpośrednio w katalogu głównym archiwum (pomyśl o
/a/foo
/b/foo
/foo
chaosie usuwania/a
i/b
).To samo dzieje się z
tar --strip-component
. Nie ma jednego uniwersalnego rozwiązania.Tak więc, aby usunąć katalog główny, zakładając, że jest jeden (i tylko jeden):
Upewnij się tylko, że pliki / katalogi drugiego poziomu nie mają tej samej nazwy rodzica najwyższego poziomu (na przykład
/foo/foo
). Ale/foo/bar/foo
i/foo/bar/bar
są w porządku. Jeśli tak, lub po prostu chcesz być bezpieczny, możesz użyć temp temp do ekstrakcji:Jeśli używasz Bash, możesz sprawdzić, czy najwyższy poziom to pojedynczy katalog, czy nie używasz:
Mówiąc o Bash, należy włączyć,
dotglob
aby dołączyć ukryte pliki, a wszystko można zawinąć w jedną, przydatną funkcję:Teraz włóż to do swojego
~/.bashrc
lub~/.profile
już nigdy nie będziesz się o to martwić. Po prostu użyj jako:(zauważ, że utworzy się automatycznie
mysubfolder
, jeśli nie istnieje)źródło
Nie mogłem znaleźć takiej opcji na stronach podręcznika dla
unzip
, więc obawiam się, że to niemożliwe. :(Jednak (w zależności od sytuacji) można obejść ten problem. Na przykład, jeśli masz pewność, że nazwa jedynego katalogu najwyższego poziomu w pliku zip,
foo-
po którym następuje numer wersji, możesz zrobić coś takiego:źródło
rm -rf foo-*
celowo, ponieważ jest to potencjalnie niebezpieczne. Co jeśli już istnieje folder o nazwiefoo-bar
? Pamiętaj, że rozpakowywanie odbywa się w/tmp
folderze, który co pewien czas jest automatycznie opróżniany.&&
: dany krok ma miejsce tylko wtedy, gdy poprzedni krok się powiódł, więc ostatni (arm
) działa tylko wtedy, gdy wszystkie kroki zostały zakończone bez błędu./tmp/some-hardcoded-folder-name
nie należy używać użytkownika jako folderu tymczasowego, ale zamiast tego należymktemp
do tego użyć : gwarantuje to, że nie będzie takiego istniejącego folderu. Sprawdź moją odpowiedź poniżej.Możesz użyć
-j
do śmieciowych ścieżek (nie twórz katalogów). Jest to zalecane tylko w przypadku dość powszechnych archiwów jednopoziomowych. Archiwa z wielopoziomowymi strukturami katalogowymi zostaną spłaszczone - może to nawet prowadzić do kolizji nazw plików w celu wyodrębnienia.Ze strony man rozpakowania:
źródło