Jak wyodrębnić pliki do innego katalogu za pomocą polecenia „tar”?


672

Myślałem, tar archive.tar /users/mylocationże zadziała, ale nie działa. Jak mogę to zrobić?


1
Również -C, --directory DIR\n change to directory DIRpowinien być raczej opisany jako change output directory to DIR (will fail if DIR doesn't exist). Dzięki @Mich. Zobacz także odpowiedź @ Bryan_Larsen.
ważne

1
@Ujjwal Sing: Rzeczywiście, strona man tar nie jest aż tak pomocna. Opisuje „-C DIR” jako „przejście do katalogu DIR”. Co gorsza: „tar -C mydir xf archive.tar” nie działa, podczas gdy „tar xf archive.tar -C mydir” nie działa.
Pat Morin,

@PatMorin Aby być uczciwym, gdy zrozumiesz argument, że konwencje wywoływania, których używasz, ma sens. Możesz także zrobić tar xfC archive.tar mydirlub tar -C mydir -xf archive.tar. Tylko mieszanie flag w stylu tradycyjnym i w stylu GNU niszczy rzeczy, ponieważ ... jest to całkiem oczekiwany rodzaj. Tradycyjne flagi są przekazywane jako jedna kropelka jako pierwszy argument. Nie możesz oczekiwać, że będą działać, jeśli nie będą pierwsi. (Mam na myśli, tak, i tak można to zinterpretować - chodzi mi o to, że byłoby ponad i poza, nie standardowe)
Nic Hartley,

Odpowiedzi:


958

Aby wyodrębnić archiwum do katalogu innego niż bieżący, użyj opcji -Club lub --directorytar, jak w

tar -xf archive.tar -C /target/directory

Pamiętaj, że katalog docelowy musi istnieć przed uruchomieniem tej komendy (może być utworzony przez mkdir /target/directory).

Przeczytaj stronę podręcznika (polecenie:), man taraby poznać inne opcje.


Czy ścieżkę można usunąć: tzn. Po prostu pobierz plik
zzapper

3
Jeśli jest to większy plik, po uruchomieniu polecenia nie otrzymasz danych wyjściowych przez kilka sekund, a nawet minut, gdy działa. Możesz to naprawić, dodając -vflagę ( tryb pełny ), która wyświetla nazwę każdego pliku podczas jego wyodrębniania.
IQAndreas,

Jeśli masz z tym kłopoty, zwróć również uwagę --strip-components=1na drugą odpowiedź.
DreadPirateShawn,


9
Czy to nie dziwne, że po tylu latach, gdy wszystkie opcje tarsię zgromadziły, nadal nie ma możliwości utworzenia katalogu wyjściowego, jeśli nie istnieje ?
EM0

260

Zauważ, że jeśli twój plik tar zawiera już nazwę katalogu, który chcesz zmienić, dodaj --strip-components=1opcję:

tar xf archive.tar -C /target/directory --strip-components=1

2
Dziękuję Ci. Pliki do pobrania przez wget / etc zawsze mają katalog „nadrzędny”. Jest to kompletna odpowiedź imo - lub należy zauważyć w odpowiedzi powyżej.
bshea

Właśnie tego szukałem. --strip-componentsjest bardzo przydatny podczas uruchamiania dostawców, którzy mogą używać różnych wersji. W ten sposób /target/directorymoże być ogólna nazwa bez martwienia się o to, jak dostawca zdecydował się nazwać folder archiwum.
Jack_Hu

30

Łącząc poprzednie odpowiedzi i komentarze:

Aby po prostu wypakować zawartość i utworzyć katalog docelowy, jeśli go brakuje:

mkdir -p /target/directory && tar xf archive.tar -C /target/directory

Aby wyodrębnić, a także usunąć katalog główny (pierwszego poziomu) z zip

mkdir -p /target/directory && tar xf archive.tar -C /target/directory --strip-components=1

20

Inną opcją jest użycie opcji - one-top-level. Spowoduje to automatyczne utworzenie katalogu na podstawie nazwy pliku oryginału.

tar zxvf filename.tgz --one-top-level

Dodatkowo, jeśli chcesz, możesz określić własne, a tar utworzy je automatycznie.

tar zxvf filename.tgz --one-top-level=new_directory

3
Używam GNU tar 1.26 i --one-top-level
pojawia

Oto odpowiedź, której potrzebowałem. Bardzo przydatne „nie”, aby określić nazwę katalogu lub pamiętać specjalny kod, który będzie odnosił się do pliku z nazwą. Dziękuję Ci.
Hipokrytus

2

Interesujące w odniesieniu do ekstrakcji jest to, że zależy to od sposobu utworzenia archiwum, zobacz ten przykład

cd /tmp
mkdir folder
touch folder/file.txt

kiedy to zrobisz, tar -zcvf folder.tar.gz folderwszystko jest zgodne z oczekiwaniami = kiedy je teraz rozpakowujesz, to zostanie rozpakowane (folder zostanie utworzony, jeśli go usuniesz) jako /tmp/folder/.

Ale kiedy utworzysz tar as tar -zcvf tmp-folder.tar.gz /tmp/folderi rozpakujesz go w folderze / tmp, wynikiem będzie /tmp/tmp/folderkatalog! W takim przypadku musisz to zrobić, aby / -tar -xf tmp-folder.tar.gz -C /


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.