Tworzenie archiwum tar bez uwzględnienia katalogu nadrzędnego, gdy pliki są przechowywane w różnych katalogach

11

W systemie plików mam następujące cztery pliki:

/home/martin/cvs/ops/cisco/b/s1
/home/martin/cvs/ops/cisco/b/s2
/home/martin/cvs/ops/extreme/b/r3
/home/martin/cvs/ops/j/b/r5

Muszę umieścić te pliki w archiwum tar, ale nie chcę dodawać katalogów. Najlepsze, co mogłem wymyślić, to:

tar -C ~/cvs/ops/ -czvf archive.tgz cisco/b/s1 cisco/b/s2 extreme/b/r3 j/b/r5

To wciąż nie jest idealne, ponieważ każdy plik w archiwum ma głębokość dwóch katalogów. Czy jest lepszy sposób? Czy mogę po prostu skopiować s1, s2, r3i r5pliki do jednego katalogu i utworzyć archiwum z tar -czvf archive.tgz s1 s2 r3 r5?

Jaskółka oknówka
źródło

Odpowiedzi:

17

Możesz użyć -Cwiele razy (przejście z jednego katalogu do drugiego):

tar czvf archive.tar.gz -C /home/martin/cvs/ops/cisco/b s1 s2 -C ../../extreme/b r3 -C ../../j/b r5

Zauważ, że każda -Copcja jest interpretowana w stosunku do bieżącego katalogu w tym momencie (lub możesz po prostu użyć ścieżek bezwzględnych).

Stephen Kitt
źródło
11

Jeśli masz listę plików w pliku lub możesz wygenerować je za pomocą polecenia, możesz użyć pojedynczego polecenia GNU tar:

tar cf foo.tar -T list-of-files --transform 's:.*/::'

Transformacja nadal zachowuje katalogi, ale całkowicie spłaszcza układ. Potrzebujesz więc jakiegoś sposobu filtrowania katalogów, stąd potrzeba listy plików.

muru
źródło
8

Możesz dołączać pliki do archiwum jeden po drugim:

tar cf /tmp/archive.tar -C /home/martin/cvs/ops/cisco/b s1
tar rf /tmp/archive.tar -C /home/martin/cvs/ops/cisco/b s2
tar rf /tmp/archive.tar -C /home/martin/cvs/ops/extreme/b r3
tar rf /tmp/archive.tar -C /home/martin/cvs/ops/j/b r5

Możesz to zrobić w skrypcie, aby ułatwić: dla każdej ścieżki uruchom tar rfz katalogiem podstawowym jako wartością -Cparametru i podstawową nazwą pliku bez ścieżki do dodania.

janos
źródło