file tar dari direktori lain tanpa menyalinnya

10

Ini seharusnya sangat sederhana bagi para ahli di sini.

Saya memiliki akun Linux dengan kuota disk pengguna hanya 6GB. Ada beberapa folder data /optdengan sekitar 3GB data dengan ketika dikompresi muncul 1GB. Ada beberapa tautan simbolis di dalamnya data-folder. Biasanya untuk mengambil cadangan pekerjaan saya biasa melakukan hal berikut.

cp -rvfL /opt/data-folder ~/
cd ~/
tar -zcvf data-folder.tar.gz data-folder
rm -rvf data-folder

Sekarang saya sudah mengkonsumsi 2,5GB dalam kuota disk pengguna saya, saya hanya memiliki cukup ruang untuk menyalin file ke rumah saya, tetapi tidak untuk taritu lagi.

Apakah ada cara untuk tar dan salin folder dengan dalam satu perintah, katakan dengan menggunakan pipa.

PS Saya tidak bisa tar /optkarena saya hanya memiliki akses baca /opt.

Kamath
sumber
Anda tentu bisa tar / opt, Anda tidak bisa menulis di sana, itu saja. Bendera 'f' untuk tar (3) mengatakan untuk menyetor hasil dalam file itu, yang bisa sangat baik di tempat lain. Yaitu cd /opt; tar zcf $HOME/junk.tar.gz junk,.
vonbrand

Jawaban:

5

Anda ingin membuat file tar jauh dari tempat file yang Anda perlu tar berada?

Ada banyak cara untuk melakukan ini.

Jika ingin dibuat secara lokal (= pada mesin yang sama):

tar czvf /path/to/destination/newfile.tar.gz  ./SOURCEDIR_OR_FILES

Anda dapat menambahkan file tambahan atau direktori ke tar di akhir perintah itu.

Jika ingin dibuat dari jarak jauh (yaitu, Anda ingin membuat file tar pada host jarak jauh dari yang berisi data yang akan ditala):

tar czvf - ./SOURCEDIR_OR_FILES | ssh user@host 'cat > newfile.tar.gz'

Versi yang lebih baru sangat serbaguna. Misalnya Anda juga bisa "menduplikasi" direktori + subdir menggunakan teknik yang sama:

Gandakan subdirektori direktori + ke direktori lokal lain:

tar cf - ./SOURCEDIR_OR_FILES | ( cd LOCAL_DEST_DIR && tar xvf - )

Gandakan subdirektori direktori + ke direktori jarak jauh lain:

tar cvf - ./SOURCEDIR_OR_FILES | ssh user@host 'cd REMOTE_DEST_DIR && tar xf - '

Lepaskan 'v' jika Anda tidak memerlukannya untuk menampilkan file karena file tersebut ter-tar (atau tidak ditandai): maka akan berjalan lebih cepat, tetapi tidak akan banyak bicara kecuali ada kesalahan.

Saya menggunakan "./ ..." untuk sumber memaksa tar untuk menyimpannya sebagai jalur RELATIF. Dalam beberapa kasus, Anda ingin menambahkan informasi jalur tambahan:

Sebagai contoh untuk tar file crontab, termasuk yang ada di / etc, Anda bisa melakukan:

cd / ; tar czf all_crons.tgz  ./etc/*cron*  ./var/spool/cron

Saya sengaja menggunakan jalur relatif: beberapa versi tar LAMA mungkin berbahaya dan mengekstrak file dengan jalur GLOBAL aslinya, artinya Anda dapat melakukannya: cd /safedir ; tar xvf sometardan meminta file dengan nama global menimpa file di jalur aslinya, yang berada di luar / safedir dan tidak di bawahnya! Sangat berbahaya, dan masih mungkin karena ada server produksi lama di luar sana. Lebih baik digunakan untuk menggunakan jalur relatif sepanjang waktu, bahkan jika Anda menggunakan tar yang lebih baru.

Olivier Dulac
sumber
lain bukan tentang perbedaan antara ter: pada beberapa Anda mungkin perlu menggunakan -cvfbukannya cvf, yang lain tidak akan mengenali -gaya. Dan zdulu berarti "kompres dengan 'kompres'", tetapi pada tar 'baru-baru ini' itu berarti "kompres dengan gzip". Anda bisa tahu mana kompresi digunakan pada file dengan: file zefile. Dan kemudian ganti nama sesuai (jika penggunaan tar Anda compress, itu sebaiknya diganti namanya .tar.Z bukan .tar.gz)
Olivier Dulac
0

Gunakan -hopsi tar. Dari halaman manual:

-h, --dereference
don't archive symlinks; archive the files they point to

jadi kamu bisa menggunakan tar -zcvfh data-folder.tar.gz /opt/data-folder

harish.venkat
sumber
Ohh saya seharusnya menyebutkannya, saya sudah mencoba tar -zcvfh ~ / data-folder.tar.gz / opt / data-folder. Saya masuk ke semacam masalah arsip melingkar. Saya terus menyalin beberapa file dan tidak pernah berakhir.
Kamath
Sepertinya ada tautan simbolik melingkar di sub folder data.
Kamath
2
@AUZKamath, itu bug di GNU tar. Anda mungkin ingin mencoba bsdtarsebagai gantinya, atau pax( cd /opt && pax -Lw data-folder | gzip > ~/data-folder.tar.gz) yang akan mendeteksi loop
Stéphane Chazelas
1
@AUZKamath Anda dapat secara bersamaan tar dan menghapus file dari direktori home Anda gunakan tar -rf <tarfilename> <filename>untuk menambah file tar yang ada.
harish.venkat
1
@Stephane Chazelas, berfungsi, Anda harus memasangnya sebagai jawaban.
Kamath