Obecnie bardzo nieefektywnie robię w skrypcie:
cp -a $MYPATH /tmp/$VERSION
cd /tmp
tar cjf archive.tar.bz2 $VERSION
Chcę, aby wszystko było zawarte w katalogu o nazwie $ VERSION - czy istnieje sposób, aby to zrobić bez konieczności kopiowania wszystkiego, jak w powyższym skrypcie?
tar cjf archive.tar.bz2 $MYPATH
?Odpowiedzi:
Wersja GNU
tar
obsługuje tę--transform
opcję (i jej alias--xform
), możesz jej użyć w ten sposóbNa przykład, biorąc pod uwagę to drzewo katalogów
Komenda
stworzy archiwum podobne do
źródło
flags=r;
rozwiązuje problem, jak wspomniano w stackoverflow.com/a/29661783/388803 .s/^a\//b\//
.tar -t
nadal pokazuje,a/
gdy wszystkie inne pliki są poniżejb/
; Zakładam, że jest to niebezpieczne i nie muszę tak naprawdę chronić przed jakimś innym plikiem z tym samym prefiksem, który nie jest katalogiem w pliku tar; więc żaden ukośnik nie jest w porządku, nie mam nic przeciwko, aby wiedzieć, jak najlepiej poradzić sobie z przypadkiema/
transformacji, ale nie,aa/
jeśli byłoby to rodzeństwo węzła głównego.Aby załadować bieżący katalog i dodać prefiks, działało to dla mnie:
źródło
Jeśli możesz uciec bez zachowania dowiązań symbolicznych w drzewie plików, na które celujesz, możesz to zrobić
Te
h
środki opcja dereference dowiązania, czyli zawierać plik lub katalog, że dowiązanie zamiast po prostu rejestrując fakt, że nie było dowiązanie symboliczne i co wskazał.źródło
Aby wygodnie dodać prefiks katalogu, użyj innego separatora niż
/
w--transform
argumencie, np.+
Lub,
jak w odpowiedzi Andy'ego.Tak więc, dla prostszego przypadku, masz kilka plików w bieżącym katalogu i nie chcesz tworzyć tarbomb .
Składnia jest
s+search+replace+
, i^
dlatego po prostu pasuje do początku nazwy pliku.A teraz, aby odpowiedzieć na OP - cóż, można uniknąć kopiowania całego katalogu
/tmp
, uruchamiając:Alternatywnie:
(twardy link, unika problemów z dowiązaniami symbolicznymi)
Dwa ostatnie zostały uwzględnione w celach rozrywkowych, ja sam trzymałbym się odpowiedzi toro2k.
źródło