Bagaimana cara tar direktori dan kemudian menghapus yang asli termasuk direktori?

30

Saya mencoba tarkumpulan file dalam direktori bernama 'my_directory' dan menghapus yang asli dengan menggunakan perintah:

tar -cvf files.tar my_directory --remove-files

Namun itu hanya menghapus file individu di dalam direktori dan bukan direktori itu sendiri (yang saya tentukan dalam perintah). Apa yang kulewatkan di sini?

EDIT:

Ya, saya kira opsi 'hapus-file' cukup literal. Meskipun saya juga menemukan halaman manual tidak jelas tentang hal itu. (Di linux saya cenderung tidak terlalu membedakan antara direktori dan file yang banyak, dan kadang-kadang lupa bahwa itu bukan hal yang sama). Sepertinya konsensusnya adalah ia tidak menghapus direktori.

Namun, titik dorongan utama saya untuk mengajukan pertanyaan ini berasal dari penanganan tar terhadap jalur absolut. Karena Anda harus menentukan jalur relatif ke file yang akan dikompresi, karena itu Anda harus mengubah ke direktori induk untuk tar dengan benar. Seperti yang saya lihat menggunakan perintah tindak lanjut 'rm' berpotensi berbahaya dalam situasi itu. Jadi saya berharap untuk menyederhanakan hal-hal dengan membuat tar itu sendiri menghapusnya.

Misalnya, bayangkan skrip cadangan tempat direktori untuk mencadangkan (mis. Tar) dimasukkan sebagai variabel shell. Jika nilai variabel shell itu dimasukkan dengan buruk, ada kemungkinan bahwa hasilnya dapat dihapus file dari direktori apa pun yang Anda berada di terakhir.

Nicholas
sumber
Nicholas, maksud Anda bahwa menambah bahaya harus menghapus pohon direktori dalam langkah ekstra benar-benar valid. Saya pikir itu harus dilakukan dengan aman oleh pengarsipan. Saya juga percaya ini adalah maksud dari pencipta tar GNU, setidaknya seharusnya ;-)
mit
2
Saya telah menemukan bahwa opsi --remove-files memang menghapus direktori yang berisi - setidaknya pada beberapa platform / dalam beberapa versi - dan dalam kasus saya. Mungkin dalam kasus Anda dir yang tersisa tidak sepenuhnya kosong karena beberapa file dimodifikasi setelah tar'ed.
isync
@isync Saya sepertinya mengalami --remove-files menghapus direktori pada Ubuntu 14.04. Kecuali dalam kasus saya, saya tidak menginginkannya. Haha
Bradley Odell

Jawaban:

12

Anda kehilangan bagian yang mengatakan --remove-filesopsi menghapus file setelah menambahkannya ke arsip.

Anda dapat mengikuti operasi arsip dan penghapusan file dengan perintah seperti,

find / path / to / be / arsip / -depth -type d -empty -exec rmdir {} \;


Pembaruan: Anda mungkin tertarik untuk membaca diskusi Debian pendek ini,
Bug 424692: --remove-file mengeluh bahwa direktori "berubah ketika kita membacanya" .

nik
sumber
Mungkin itu sebenarnya: -cmengubah direktori sebelum tarmemulai pekerjaannya (dan jenis tidak kembali sampai selesai)? Saya kira itu akan menghapus subdirektori, jika itu termasuk dalam arsip (tapi saya belum mengujinya).
Arjan
@Arajan, saya tidak berpikir ' c'ada hubungannya dengan ini; 'remove-files'sengaja tidak menghapus direktori.
nik
Aha, saya menemukan penjelasan singkat "menghapus file setelah menambahkannya ke arsip" dari manhalaman - halaman yang tidak terlalu jelas tentang itu, tetapi saya menganggap Anda benar. Namun, saya tidak berharap direktori yang disebutkan untuk -cdihapus bahkan jika tar memang menghapus direktori juga. (Bagi saya, itu akan seperti menghapus direktori saat ini, maka termasuk arsip itu sendiri, ketika tidak menggunakan -c...?) Tetapi jika -remove-filesselalu meninggalkan direktori di tempat maka saya pasti hanya mempersulit hal-hal di sini. ;-)
Arjan
3
--remove-filesbug telah diperbaiki tar-1.19.
x-yuri
19

Karena --remove-filesopsi hanya menghapus file , Anda dapat mencoba

tar -cvf files.tar my_directory && rm -R my_directory

sehingga direktori dihapus hanya jika tarmengembalikan status keluar dari 0

pavium
sumber
9
kecuali bahwa Anda harus memeriksa status keluar tar sebelum melakukan rm! jika tidak, Anda mungkin dibiarkan tanpa arsip tar dan tidak ada file ...
Kim
1
Ketika menggunakan direktori satu tingkat, saya percaya pilihan yang lebih aman adalah menggunakan 'rmdir' daripada 'rm' karena hanya akan menghapus direktori kosong. [Lihat suntingan pertanyaan]
Nicholas
Tetapi rmdirhanya menghapus direktori kosong . Idenya adalah untuk menghapus direktori dan file di dalamnya (asalkan tarberhasil)
pavium
--remove-filesbug telah diperbaiki tar-1.19.
x-yuri
&& hanya akan menjalankan perintah berikut, jika perintah sebelumnya keluar 0 (berhasil). Jika keluar> 0, perintah berikut tidak akan dijalankan. Anda juga dapat membalikkan itu dengan || - hanya berjalan jika perintah pertama gagal. Cara yang baik untuk melakukan konten yang mengerikan, periksa ulang itu.
Kirrus
6

Sudahkah Anda mencoba menempatkan --remove-file directive setelah nama arsip? Ini bekerja untuk saya.

tar -cvf files.tar --remove-files my_directory
Robert Grubba
sumber
1
Kemungkinan besar perilaku tar telah berubah sejak pertanyaan ini diajukan. Bagi saya, tidak ada perbedaan dalam menempatkan --remove-filessebelum atau sesudah my_directory; dalam kedua kasus, direktori dihapus.
redburn
5
--remove-filesbug telah diperbaiki tar-1.19.
x-yuri
1
source={directory argument}

misalnya

source={FULL ABSOLUTE PATH}/my_directory

 

parent={parent directory of argument}

misalnya

parent={ABSOLUTE PATH of 'my_directory'/

 

logFile={path to a run log that captures status messages}

Kemudian Anda dapat menjalankan sesuatu di sepanjang baris:

cd ${parent}

tar cvf Tar_File.`date%Y%M%D_%H%M%S` ${source}

if [ $? != 0 ]

then

 echo "Backup FAILED for ${source} at `date` >> ${logFile}

else

 echo "Backup SUCCESS for ${source} at `date` >> ${logFile}

 rm -rf ${source}

fi
mengupas
sumber
1

Ini mungkin bug.

Juga kata "file" ambigu dalam hal ini. Tetapi karena ini adalah saklar baris perintah yang saya harapkan berarti juga direktori, karena di unix / lnux semuanya adalah file, juga direktori. (Penafsiran lain tentu saja juga valid, tetapi tidak masuk akal untuk menyimpan direktori dalam kasus seperti itu. Saya akan menganggapnya sebagai perilaku yang tidak terduga dan membingungkan.)

Tetapi saya telah menemukan bahwa di gnu tar pada beberapa distribusi gnu tar sebenarnya menghapus pohon direktori. Indikasi lain bahwa menjaga pohon itu adalah bug. Atau setidaknya beberapa solusi sampai mereka memperbaikinya.

Inilah yang saya coba pada konsol Ubuntu 10,04:

mit: / var / tmp $ mkdir tree1                                                                                               
mit: / var / tmp $ mkdir tree1 / sub1                                                                                          
mit: / var / tmp $> tree1 / sub1 / file1                                                                                        

mit: / var / tmp $ ls -la                                                                                                    
drwxrwxrwt 4 root 4096 2011-11-14 15:40.                                                                              
drwxr-xr-x 16 root root 4096 2011-02-25 03:15 ..
drwxr-xr-x 3 mit mit 4096 2011-11-14 15:40 tree1

mit: / var / tmp $ tar -czf tree1.tar.gz tree1 / --remove-files

# SEBAGAIMANA ANDA BISA MELIHAT POHON INI SEKARANG:

mit: / var / tmp $ ls -la
drwxrwxrwt 3 root 4096 2011-11-14 15:41.
drwxr-xr-x 16 root root 4096 2011-02-25 03:15 ..
-rw-r - r-- 1 mit mit 159 2011-11-14 15:41 tree1.tar.gz                                                                   


mit: / var / tmp $ tar --version                                                                                             
tar (GNU tar) 1.22                                                                                                           
Hak Cipta © 2009 Free Software Foundation, Inc.

Jika Anda ingin melihatnya di komputer Anda, rekatkan ini ke konsol dengan risiko Anda sendiri:

tar --version                                                                                             
cd / var / tmp
mkdir -p tree1 / sub1                                                                                          
> tree1 / sub1 / file1                                                                                        
tar -czf tree1.tar.gz tree1 / --remove-files
ls -la
mit
sumber