-Delete ile bul / sil / dizinimdeki dosyaları silme olmadan bulma nedenleri bulamadığında neden buldunuz?


20

Geçerli dizin ağacındaki dosyaları hariç tüm dosyaları silmek istiyorum save. Bu komutu çalıştırdım:

 find . \( -name save -prune \) -o -type f -ls | grep /save/

ve hiçbir şey bulamadı. Ama bu komutu çalıştırdığımda:

 find . \( -name save -prune \) -o -type f -delete

/ Save / içindeki tüm dosyalar kayboldu. Neyi kaçırıyorum?


4
Ah ... Bugün bir şey öğrendim (teşekkürler). Ve ben mv save/ ../some/safer/locationböyle bir "genel" silme komutundan önce basit bir tavsiye ((ama tabii ki, senin yazıdan önce ben aynı kontrolü yapardı ve aynı sorunla karşılaşmıştı!). Şimdi gidin dosya sistemi için iyi bir "silme geri" bulmak ^^
Olivier Dulac

3
Acım senin önlenmen.
Otheus

1
1000 teşekkürler. Kod (genellikle?) Gizemli bir şekilde çalışır ...
Olivier Dulac


@lesmana Cevabını oraya çektim. ne yazık ki, benim find sürümü bana böyle güzel bir uyarı
vermez

Yanıtlar:


26

-delete-depthbunun işe yaramadığı anlamına gelir -prune( -depthyapraklarla başlar). GNU sürüm kılavuzunda bununla ilgili bir uyarı var ( -deleteşimdi GNU findve diğer birkaç uygulama tarafından da desteklenen bir FreeBSD uzantısıdır ).

info find --index-search=-delete

Komut satırında '-delete' eyleminin kullanımı otomatik olarak '-depth' seçeneğini açar (* not ifadeleri bul: :). Daha önce sadece '-print' ile test yapıyorsanız bu şaşırtıcı olabilir, bu nedenle '-depth' 'i açıkça kullanmayı unutmamak genellikle en iyisidir.

info find --index-search=-prune

'-Delete', '-depth' anlamına geldiğinden, '-prune' öğesinin '-delete' ile birlikte kullanılması, istediğinizden daha fazla dosyanın silinmesine neden olabilir.

Burada, rmbunun yerine aşağıdakilerden birini kullanma seçeneğiniz vardır :

find . -name save -prune -o -type f -exec rm -f {} +

(potansiyel olarak güvenli olmayan bir sen o komutu çalıştırmak yaparken sembolik bağları dizinleri değiştirerek geçerli dizin ağacının dışında dosyaları silmek yapabiliriz orada başkaları tarafından dizini yazılabilir, varsa).

Daha güvenli bir alternatif:

find . -name save -prune -o -type f -execdir rm -f -- {} \;

Bunun yukarıda belirtilen sorunu yoktur, ancak rmdosya başına bir tane çalıştırılması anlamına gelir . --FreeBSD uygulanması değil, GNU biri olduğunu önekleri dosya adları ile için gereklidir ./.

Alternatif olarak, Costas tarafından önerildiği gibi:

LC_ALL=C find . ! -name save ! -path '*/save/*' -type f -delete

(ama yine de gereksiz yere savedizinlere iner )

Bu LC_ALL=Cnedenle, *herhangi bir bayt dizisiyle eşleşir (geçerli yerel ayarda geçerli karakterler oluşturmayanlar bile). Hata mesajlarının dilini etkileyeceğini unutmayın (kullanıcının dili yerine İngilizce).


Buradaki güvenlik sorunu nedir rm?
jrw32982 Monica

@ jrw32982, GNU bulma kılavuzuna bağlantı ile düzenlemeye bakın
Stéphane Chazelas
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.