Nasıl tar tartı ve sonra dizin de dahil olmak üzere orijinalleri kaldırmak?


30

tar'My_directory' adındaki bir dizindeki dosyaları toplamaya çalışıyorum ve orjinali komutu kullanarak kaldırıyorum:

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

Bununla birlikte, dizindeki tek tek dosyaları kaldırıyor, dizinin kendisini değil (komutta belirttiğim). Burada ne özlüyorum?

DÜZENLE:

Evet, 'remove-files' seçeneğinin oldukça değişmez olduğunu düşünüyorum. Yine de adam sayfasını bu noktada belirsiz buldum. (Linux'ta dizinler ve dosyalar arasında pek bir şey ayırt etme eğiliminde değilim ve bazen aynı şey olmadığını unutuyorum). Mutabakata benziyor, dizinleri kaldırmıyor.

Bununla birlikte, bu soruyu sormak için asıl ilgi çekici noktam, tar'nın mutlak yolları kullanmasından kaynaklanıyor. Sıkıştırılacak bir dosyaya / dosyalara göreceli bir yol belirtmeniz gerektiğinden, bu nedenle düzgün şekilde tar yapmak için ana dizine geçmelisiniz. Gördüğüm gibi herhangi bir şekilde takip eden 'rm' komutu bu durumda potansiyel olarak tehlikelidir. Böylece katranın kaldırmasını sağlayarak işleri basitleştirmeyi umuyordum.

Örneğin, yedeklenecek dizinin (ör. Tar) kabuk değişkeni olarak eklendiği bir yedekleme komut dosyası düşünün. Bu kabuk değişkeni değeri hatalı bir şekilde girildiyse, sonucun en son bulunduğunuz dizindeki dosyaları silebilir.


Nicholas, dizin ağacını fazladan bir adımda kaldırmak zorunda kalmanın tehlikesi eklediğin nokta kesinlikle geçerli. Bunun arşivleyici tarafından güvenli bir şekilde yapılmasının mümkün olması gerektiğini düşünüyorum. Ayrıca bunun GNU katranının yaratıcılarının niyeti olduğuna inanıyorum, en azından olması gereken ;-)
mit

2
-Remove-files seçeneğinin gerçekten de içerdiği dizini kaldırdığını öğrendim - en azından bazı platformlarda / bazı sürümlerde - ve benim durumumda. Sizin durumunuzda kalan dir, boş bırakıldıktan sonra değiştirilen bazı dosyalar nedeniyle tamamen boş değildi.
isync

@isync Yaşıyor gibiyim - remove-files Ubuntu 14.04'te dizinleri siliyor. Benim durumum hariç, istemiyorum. Haha
Bradley Odell,

Yanıtlar:


12

--remove-filesSeçeneğin arşive ekledikten sonra dosyaları kaldırdığını söyleyen kısmı kaçırıyorsunuz .

Arşivleme ve dosya kaldırma işlemini aşağıdaki gibi bir komutla takip edebilirsiniz.

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


Güncelleme: Bu kısa Debian tartışmasını,
424692 No'lu Bugünü okuyun: - remove-files, dizinlerin "okuduğumuz gibi değiştiğinden" şikayetçi .


Belki de aslında: işine -cbaşlamadan önce dizini değiştirir tar(ve bitinceye kadar geri dönmez)? Ben sanırım o arşive dahil olsaydı o alt dizinleri silinmiş olurdu (ama bu test etmedim).
Arjan

@Arajan, bence ' c'bununla bir ilgisi yok; 'remove-files'kasıtlı olarak dizinleri kaldırmaz.
nik

Aha, kısa bir açıklama buldum "arşive ekledikten sonra dosyaları kaldır" mansayfalarından çok açık olmayan ama haklı olduğunuzu farz ediyorum. Yine de, için belirtilen dizin beklemeyin ediyorum -chatta kaldırılacak sanki tar yanı kaldır dizinleri yaptı. (Bana göre bu, şu anki dizini silmek gibi, bu yüzden arşivi de kullanmıyorken -c...?) Ama -remove-filesdizinleri daima yerinde bırakırsa, o zaman kesinlikle sadece işleri karmaşıklaştırıyorum. ;-)
Arjan

3
--remove-fileshata düzeltildi tar-1.19.
x-yuri,

19

Yana --remove-filesseçeneği yalnızca dosyaları siler , sen deneyebilirsin

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

dizinin kaldırılması için yalnızca tar0 çıkış durumu döndürürse kaldırılır .


9
Bunun dışında, rm yapmadan önce tar'ın çıkış durumunu kontrol etmeniz gerekir! Aksi takdirde, katran arşivsiz ve dosyasız kalabilirsiniz ...
Kim

1
Bir seviye dizin kullanırken, sadece boş bir dizini kaldıracağı için 'rm' yerine 'rmdir' kullanarak daha güvenli bir seçenek olacağına inanıyorum. [Bkz soru düzenlemeleri]
Nicholas

Ancak rmdiryalnızca boş dizinleri kaldırır . Fikir dizini ve içindeki dosyaları (sağlanan tarbaşarılı)
kaldırmaktı

--remove-fileshata düzeltildi tar-1.19.
x-yuri,

&& yalnızca önceki komut 0 (başarılı) durumundan çıktıysa aşağıdaki komutu çalıştıracaktır. > 0'dan çıkarsa, aşağıdaki komut çalıştırılmaz. Bunu || - sadece ilk komut başarısız olursa çalıştırın. Kötü içerik yapmanın iyi bir yolu bunu yeniden başlatır.
Kirrus

6

Arşiv adından sonra --remove-files yönergesini koymaya çalıştınız mı? Benim için çalışıyor.

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

1
Bu sorunun ortaya çıkmasından bu yana katran davranışının değişmesi daha olasıdır. Benim için --remove-filesönce veya sonra koymakta hiçbir fark yoktur my_directory; Her iki durumda da, dizin kaldırılır.
redburn

5
--remove-fileshata düzeltildi tar-1.19.
x-yuri,

1
source={directory argument}

Örneğin

source={FULL ABSOLUTE PATH}/my_directory

 

parent={parent directory of argument}

Örneğin

parent={ABSOLUTE PATH of 'my_directory'/

 

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

Daha sonra şu satırlar boyunca bir şeyler yapabilirsin:

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

1

Bu muhtemelen bir hataydı.

Ayrıca "dosya" kelimesi bu durumda belirsizdir. Ancak bu bir komut satırı anahtarı olduğundan, dizinleri de beklerdim, çünkü unix / lnux'da her şey bir dosya, bir de dizin. (Diğer yorum elbette de geçerlidir, ancak böyle bir durumda dizinleri tutmanın bir anlamı yoktur. Beklenmedik ve kafa karıştırıcı davranışlar olarak düşünürdüm.)

Ancak bazı dağıtımlarda gnu tar'da gnu tar'nın dizin ağacını kaldırdığını buldum. Ağacı tutmanın bir hata olduğunu gösteren bir başka gösterge. Ya da en azından düzeltilene kadar geçici bir çözüm.

Bu bir ubuntu 10.04 konsolunda denediğim şeydi:

mit: / var / tmp $ mkdir tree1                                                                                               
mit: / var / tmp $ mkdir tree1 / sub1                                                                                          
mit: / var / tmp $> ağaç1 / alt1 / dosya1                                                                                        

mit: / var / tmp $ ls -la                                                                                                    
drwxrwxrwt 4 kök kökü 4096 2011-11-14 15:40.                                                                              
drwxr-xr-x 16 kök kökü 4096 2011-02-25 03:15 ..
drwxr-xr-x 3 mit mit 4096 2011-11-14 15:40 ağacı1

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

# AĞACI GÖREN GİBİ ŞİMDİ

mit: / var / tmp $ ls -la
drwxrwxrwt 3 kök kökü 4096 2011-11-14 15:41.
drwxr-xr-x 16 kök kökü 4096 2011-02-25 03:15 ..
-rw-r - r - 1 mit mit 159 2011-11-14 15:41 ağaç1.tar.gz                                                                   


mit: / var / tmp $ tar --version                                                                                             
katran (GNU katran) 1.22                                                                                                           
Telif Hakkı © 2009 Özgür Yazılım Vakfı, Inc.

Makinenizde görmek istiyorsanız, bunu bir konsola yapıştırmak kendi sorumluluğunuzdadır:

katran - değişme                                                                                             
cd / var / tmp
mkdir -p tree1 / sub1                                                                                          
> tree1 / sub1 / dosya1                                                                                        
tar -czf tree1.tar.gz tree1 / --remove-files
ls -la
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.