tworzenie archiwum tar bez dołączania katalogu nadrzędnego


62

Próbuję utworzyć program graficzny dla mojego skryptu.

Wewnątrz skryptu używam tar do utworzenia archiwum tar.

Z programu graficznego otrzymuję pełną nazwę pliku, który chcę utworzyć archiwum tar.

tar -cvf temp.tar /home/username/dir1/dir2/selecteddir 

Moje archiwum tar zawiera katalog główny, nazwę użytkownika, katalog1, katalog2 i katalog_wybrany, podczas gdy chcę, aby archiwum utworzyło archiwum zawierające tylko katalog wybrany.

Odpowiedzi:


79

Możesz skorzystać z -Copcji, taraby to zrobić:

tar -C /home/username/dir1/dir2 -cvf temp.tar selecteddir

Ze strony podręcznika użytkownika tar:

-C directory
         In c and r mode, this changes the directory before adding the following files.  
         In x mode, change directories after opening the archive but before extracting 
         entries from the archive.

czy wiesz, jak mogę podzielić $ path na selecteddir i path up / / home / username / dir1 / dir2, abym mógł wybrać opcję -C
Sujit Maharjan,

@SujitMaharjan można użyć dirnamedo wyodrębnienia wszystkiego aż do „selecteddir” i basenamedo wyodrębnienia „selecteddir”. Wypróbuj dwa polecenia z argumentem $ path.
mkc

2
Warto dodać, że dotyczy to zarówno GNU, jak i BSD Tar.
Luke Exton,

5
Pamiętaj, że nie można używać globowania z opcją -C. tar -C /home/username/dir1/dir2 -cvf temp.tar '*.csv'nie zadziała.
Christian Długi

Nie działa: tar: selecteddir: Nie można stat: Nie ma takiego pliku lub katalogu
tribbloid

11

Istnieją dwie metody rozwiązania tego problemu.

Pierwszy, moim zdaniem, jest łatwiejszy. Po prostu cddo katalogu bezpośrednio nad tym, który chcesz skompresować. W tym przypadku byłoby dir2.

$ cd /home/username/dir1/dir2/
$ tar -cvf temp.tar selecteddir

Drugim sposobem jest użycie opcji, --transformktóra przyjmuje sedwyrażenie i uruchamia je względem nazw plików. Uwaga: będziesz musiał uciec /w sedwyrażeniu.

$ tar -cvf temp.tar /home/username/dir1/dir2/selecteddir --transform='s/\/home\/username\/dir1\/dir2\///g'

Czy pierwsza metoda wymaga kropki (.) Na końcu? Próbowałem go bez i otrzymała: tar: Cowardly refusing to create an empty archive. Kiedy mam kropkę, denerwująco sprawia, że ​​root zawiera katalog o nazwie .. Tak blisko, ale nie idealnie.
JW01,

1
W nawiązaniu do mojego poprzedniego komentarza. Rozwiązałem mój problem. $ cd /home/username/dir1/dir2/ && tar -cvf temp.tar selecteddir *pracował dla mnie. Używanie gwiazdki zamiast kropki .. Aktualizacja: Woops - chociaż straciłem ukryte pliki.
JW01,

6

Najpierw przejdź do katalogu roboczego,

cd /your/working/directory/ 

Następnie użyj magii *:-)

tar -cvf temp.tar *

Próbuję zarchiwizować ukryte katalogi i jeśli dodam je bezpośrednio (Nie *), to zadziała, ale przy użyciu * dodaje tylko nazwę archiwum do archiwum ...
Ole

1

Właściwie znalazłem problem z odpowiedzią Ketana

tar -C / home / nazwa użytkownika / katalog1 / katalog2 -cvf temp.tar wybrany katalog

Kiedy chcesz po prostu skopiować wszystkie pliki w katalogu dir2, tylko wszystkie pliki, wtedy najpierw wpadam na pomysł:

tar -C / home / nazwa użytkownika / katalog1 / katalog2 -cvf temp.tar *

Jednakże, gdy nie ma Cię w katalogu dir2, spowodowałoby to problem, ponieważ * zapisuje pliki tar w bieżącym diectroy. Naprawiłem problem za pomocą poniższego polecenia:

 tar -C /home/username/dir1/dir2 -cvf temp.tar ./

6
Ale wtedy twoje archiwum temp.tar zawiera .jako folder główny.
cgrim
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.