rozpakuj „tar”, ale zmień nazwę katalogu, do którego chcesz wypakować

26
tar -tf filename.tar
folder1/file
folder1/name
[...]

Chciałbym wyodrębnić plik i nazwę , folder2 . Czy można to zrobić jako jedno-liniowy?

Felipe Alvarez
źródło

Odpowiedzi:

35

Użyj -Ci --strip-components(Zobacz man tar).

Przykład:

mkdir FOLDER
# for remote tar file
curl -L ’remote_tar_file' | tar -xz - -C FOLDER --strip-components=1

# for local tar file
tar -xzf FILENAME -C FOLDER --strip-components=1

Wyjaśnienie:

-CFlag zakłada katalog jest już na miejscu, więc zawartość pliku tar może być rozszerzona do niego. stąd mkdir FOLDER.

--strip-componentsFlaga jest używany, gdy plik tar naturalnie rozwinąć się w folderze, powiedzmy, jak github gdzie przykłady do repo-name-masterfolderu. Oczywiście nie potrzebujesz generowanego tutaj folderu pierwszego poziomu, więc --strip-componentsustaw go tak, aby 1automatycznie usuwał ten pierwszy folder. Im większa liczba, tym głębsze zagnieżdżone foldery są usuwane.

Marian
źródło
Czytam man tar. Nie zauważyłem --strip-components. fajny
Felipe Alvarez
1
tar-1.14 używa --strip-path, tar-1.14.90 + używa --strip-components. Może problem tutaj?
Mikhail Moskalev
Głosowałbym za tym, gdyby podał przykład, a nie tylko przełączniki, jak podaje instrukcja online , 3 style argumentów powodują zamieszanie.
Iain
Myślę, że zapomniałem -f na tar -xz. Nie udało mi się. Myślałem, że używam tego bez powodu przez cały ten czas ...
John Carrell,
17

Możesz także użyć tej --transformopcji, aby uzyskać nieco większą elastyczność. Akceptuje wszelkie operacje zastępowania sed.

Na przykład w ten sposób rozpakowuję archiwum linuksowe do nowego katalogu, aby móc zastosować łatkę:

tar -xjf linux-2.6.38.tar.bz2 --transform 's/linux-2.6.38/linux-2.6.38.1/'
Tomek
źródło