Giriş dizinime 'rm -r ~' ne yaptı?


17

gedit, '~' ile biten gizli yedekleme dosyaları oluşturur. Dizin ağacımı yinelemeli bir şekilde temizlemek istedim.

Komut rm *~, '~' ile biten tüm yerel dosyaları silecek

rm -r *~ .Tüm ağaçtaki tüm dosyaları sileceğini düşündüm , ama yazdım rm -r ~.

Bazı dizinin silinemediği bir mesaj vardı ve komuttan çıktım. Soru şu: Ne sildim?

Filezilla yapılandırmamın kaybolduğunu fark ettim. Bu komut tüm gizli dizinleri home dizininden siliyor mu?


4
En azından bir yedekleme stratejim var ... Gerçek bir zarar yok.
GUI Junkie

2
Bunu bildiğim iyi oldu; Her -rşeyden kurtulmak istemediğim sürece asla kullanmama politikam var .
ish

3
Yan not olarak, rm -r *~ .eşleşen tüm dosya ve klasörleri (geçerli dizinde) siler *~veya .. ( .Tarafından göz ardı edilecektir rmçoğu insan yinelemeli geçerli dizin silmek istemiyoruz olarak, özel bir istisna olarak. *~Simdiki tüm dosyaları ve dizinleri siler o ucu içinde ~, ama değil geçerli dizinin alt dizinlerinin dosyaları ve dizinleri. ) Yani bu istemezdin. Büyük olasılıkla , dizin ağacını özyinelemeli olarak aramak ve biten her dosyayı özyinelemesiz olarak silmek findiçin -execbayrakla birlikte kullanmak istersiniz . ~
Eliah Kagan

@EliahKagan, sanırım, ama -exec ile bulmak her zaman bir güçlüktür. Ev direği geri yükleme bir güçlük daha olsa da, :-)
GUI Junkie

1
Bilgilendirici: ~karakteri kaçmadan söyleyin (böyle \~:) Bash, ZSH, vb. ( rmTemel olarak komut) giriş dizini anlamına geldiğinizi düşündürür.
Thomas Ward

Yanıtlar:


31

Tüm giriş dizininizi sildiniz (neredeyse)!

rm -r something bir şeyin içindeki / altındaki dosyaları ve dizinleri tekrar tekrar siler ; yalnızca farklı bir kullanıcının sahibi olduğu (örneğin root) veya kullanımda olduğu için (örn. bir GVFS bağlantısı) silme iznine sahip olmayan öğelerde başarısız olur .

Eklemediyseniz -f(olduğu gibi rm -rf something), şöyle bir şey alırsınız:

rm: remove write-protected regular file something’?
rm: descend into write-protected directory something’?

Bu noktada iptal edebilirsiniz ve muhtemelen yanlış komutu yürüttüğünüzü fark edersiniz.

Bu tür kazaların nasıl önleneceğine dair topluluktan öneriler

Not: Topluluk wiki, lütfen herkes katkıda bulunmaktan çekinmeyin.

  • Birkaç dosya için, -idosyaları veya dizinleri kaldırma konusunda onay almak için bu seçeneği kullanın:

    $ rm -ri something/
    rm: remove regular file something/file~’? y
    rm: descend into directory something’? y
    rm: remove regular file something/file’? y
    rm: remove directory something’? y
    
  • Geçerli bir ./dizinden kaldırılıyorsa, farklı bir konumu yanlış bir şekilde kaldırmaktan kaçınmak için a ile önekini ekleyin .:

    $ cd something
    $ rm -v ./*~
    removed ‘./file~’
    

    Yukarıdakilerin kullanımını göstermek içindi ./. Bir alt dizin varsa, elbette de kullanabilirsiniz rm -v something/*~. Dikkat : rm ./.*geçerli dizindeki tüm gizli dosyaları kaldırdığını düşünmeyin . Gizli dosyalar globbing ile ilgili geçici çözümler için bu Serverfault sorusuna bakın .

  • Silmek yerine taşıyın: Dosyaları ilk etapta yinelemeli olarak silmek yerine, sonunda silmeden önce başka bir yerden kurtulmak istediğim dosyaları taşımak için alıştım . Bir şeyler ters giderse geri yüklemesi kolaydır.

    mv -b SOURCE DEST
  • Kullanım find(muhtemelen ile grep) için önizleme özyinelemeli seçilen dosyaları silmek istiyorum. Bunu nadir bir olay haline getirmeye çalışmalısınız, ancak eğer yapmanız gerekiyorsa ...

    1. findargüman olmadan, geçerli dosya altındaki tüm dosyaları / dizinleri özyinelemeli olarak listeler. man findNasıl seçici hale getireceğinizi aramaya çalışmalısınız (bir hazine sandığı), ancak rahatsız grepetmek istemiyorsanız, silmek istediğiniz dosyalar için filtrelemek için tanıdık kullanabilirsiniz .
    2. Bir uber-l33t çekirdek korsanı olduğumu ve kaynak ağacımdaki birkaç KB "örnek" dosyadan rahatsız olduğumu varsayalım; Adında yer alan tüm dosyaları silmek istiyorum. Bu yüzden find | grep examplebana bu 20 dosyayı veren yazıyorum . Bu iyi görünüyor, bu yüzden şimdi gidip rm -vdaha önce belirtilen ayrıntılı çıktı ile birlikte bu tam dosyaları silmek xargs:
      bul | grep örneği | xargs rm -v
      bu da bana bu çıktıyı veriyor . Böyle bir önizleme, samplebunun yerine yazım hatası ve yazım yaptığınız sorunları önler example.

Boşluklar, sekme karakterleri, yeni satırlar veya tırnak işaretleri ( "veya ') içeren dosya adlarınız varsa, yukarıdaki çözüm kullanılmamalıdır , çünkü bu xargsbaşarısızlığa neden olur veya rmeksik dosya adlarıyla beslenir ; Dosyalar. Yukarıdakileri yapmanın güvenli yolu, hepsini findoperatörleri ve eylemleriyle yapmaktır .

Aşağıdaki kelimeyi içeren tüm dosyaları gösterecektir example

find . -name "*example*"  

Bu liste kaldırmak istediğiniz -execdosyalarsa, dosyaları aktarmak için eylemi kullanın rm.

find . -name "*example*" -exec rm -v {} +

Kullanımla ilgili daha fazla yardım için Bul özelliğini kullanma konusuna bakın find.


1
boru findçıkışı grepve xargs rmtehlikelidir.
geirha

2
@izx: eklendi mv(benim en sevdiğim komut);)
Takkat

1
findDosya adları boşluk, sekme, yeni satır "veya 'karakter içeriyorsa, en azından güvenli yolu kullanma örneğini eklerim . Örn find . -name "*example*" -exec rm -v {} +. mywiki.wooledge.org/UsingFind
geirha

1
@geirha: neden bu find -deletekadar tehlikeli? Burada bir şey söylerdim ama son zamanlarda buldum ve /kuru bir çalışma rağmen benim seçeneği sildim dışında bilmiyorum -deletesadece kaldırmak istediğim birkaç dosya bulundu. Bunun -exec rmyerine tavsiye ettiğinizi görüyorum .
Takkat

3
@Takkat -deletetehlikeli değildir ve yerine güvenle kullanabilirsiniz -exec rm {} +. Genellikle mümkün olduğunda standart araçlar ve özellikler kullanmayı tercih ederim. -deletestandart olmayan bir GNU uzantısıdır find, bu nedenle Ubuntu üzerinde iyi çalışır, ancak diğer sistemlerde çalışmayabilir.
geirha

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.