Bir Dizindeki Bir veya Birkaç Uzantılı Dosya Dışında Tüm Dosyaları Silmenin 3 Yolu


Bazen bir dizindeki tüm dosyaları silmeniz veya belirli bir türdeki (belirli bir uzantıyla biten) dosyalar dışındaki tüm dosyaları kaldırarak dizini temizlemeniz gereken bir durumla karşılaşırsınız.

Bu makalede, rm, find ve globignore komutlarını kullanarak belirli dosya uzantıları veya türleri dışında bir dizindeki dosyaları nasıl sileceğinizi göstereceğiz.

Daha ileri gitmeden önce, Linux'taki önemli bir kavrama, elimizdeki sorunla başa çıkmamızı sağlayacak dosya adı modeli eşleştirmeye kısaca göz atarak başlayalım.

Önerilen Okuma: Linux'ta Birden Çok Dosya Adını/Uzantısını Aramak için Find Komutunu Kullanın

Linux'ta kabuk modeli, joker karakterler veya meta karakterler olarak adlandırılan aşağıdaki özel karakterlerden oluşan bir dizedir:

  1. * – sıfır veya daha fazla karakterle eşleşir
  2. ? – herhangi bir tek karakterle eşleşir
  3. [seq] – sıradaki herhangi bir karakterle eşleşir
  4. [!seq] – sıradaki olmayan herhangi bir karakterle eşleşir

Burada inceleyeceğimiz üç olası yöntem vardır ve bunlar şunları içerir:

Genişletilmiş Desen Eşleştirme Operatörlerini Kullanarak Dosyaları Silme

Farklı genişletilmiş model eşleştirme operatörleri aşağıda listelenmiştir; burada desen-listesi, | karakteri kullanılarak ayrılmış bir veya daha fazla dosya adı içeren bir listedir:

  1. *(pattern-list) – belirtilen kalıpların sıfır veya daha fazla tekrarıyla eşleşir
  2. ?(pattern-list) – belirtilen kalıpların sıfır veya bir örneğiyle eşleşir
  3. +(örüntü listesi) – belirtilen kalıpların bir veya daha fazla tekrarıyla eşleşir
  4. @(desen listesi) – belirtilen kalıplardan biriyle eşleşir
  5. !(pattern-list) – verilen kalıplardan biri dışındaki her şeyle eşleşir

Bunları kullanmak için extglob kabuk seçeneğini aşağıdaki şekilde etkinleştirin:

shopt -s extglob

1. Bir dizindeki dosya adı dışındaki tüm dosyaları silmek için aşağıdaki komutu yazın:

rm -v !("filename")

2. dosyaadı1 ve dosyaadı2 dışındaki tüm dosyaları silmek için:

rm -v !("filename1"|"filename2") 

3. Aşağıdaki örnek, tüm .zip dosyaları dışındaki tüm dosyaların etkileşimli olarak nasıl kaldırılacağını gösterir:

rm -i !(*.zip)

4. Daha sonra, bir dizindeki tüm .zip ve .odt dosyaları dışındaki tüm dosyaları aşağıdaki gibi silebilirsiniz, aynı zamanda ne olduğunu görüntülerken Tamamlandı:

rm -v !(*.zip|*.odt)

Gerekli tüm komutları aldıktan sonra extglob kabuk seçeneğini şu şekilde kapatın:

shopt -u extglob

Linux find Komutunu Kullanarak Dosyaları Sil

Bu yöntemde, find komutunu özel olarak uygun seçeneklerle veya xargs komutuyla birlikte aşağıdaki formlarda olduğu gibi bir ardışık düzen kullanarak kullanabiliriz:

find /directory/ -type f -not -name 'PATTERN' -delete
find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm {}
find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm [options] {}

5. Aşağıdaki komut geçerli dizindeki .gz dosyaları dışındaki tüm dosyaları silecektir:

find . -type f -not -name '*.gz'-delete

6. Bir ardışık düzen ve xargs kullanarak yukarıdaki durumu aşağıdaki gibi değiştirebilirsiniz:

find . -type f -not -name '*gz' -print0 | xargs -0  -I {} rm -v {}

7. Ek bir örneğe bakalım, aşağıdaki komut .gz, .odt ve dışındaki tüm dosyaları silecektir. Geçerli dizindeki .jpg dosyaları:

find . -type f -not \(-name '*gz' -or -name '*odt' -or -name '*.jpg' \) -delete

Bash GLOBIGNORE Değişkenini Kullanarak Dosyaları Silin

Ancak bu son yaklaşım yalnızca bash ile çalışır. Burada, GLOBIGNORE değişkeni, yol adı genişletmesi tarafından göz ardı edilecek iki nokta üst üste ayrılmış bir model listesi (dosya adları) saklar.

Önerilen Okuma: Linux'ta Grep Komutu ile İlgili Faydalı 12 Pratik Örnek

Bu yöntemi kullanmak için temizlemek istediğiniz dizine gidin ve ardından GLOBIGNORE değişkenini aşağıdaki gibi ayarlayın:

cd test
GLOBIGNORE=*.odt:*.iso:*.txt

Bu durumda, .odt, .iso ve .txt dosyaları dışındaki tüm dosyalar geçerli dizinden kaldırılır.

Şimdi dizini temizlemek için komutu çalıştırın:

rm -v *

Daha sonra GLOBIGNORE değişkenini kapatın:

unset GLOBIGNORE

Not: Yukarıdaki komutlarda kullanılan işaretlerin anlamını anlamak için, çeşitli resimlerde kullandığımız her komutun kılavuz sayfalarına bakın.

Bu kadar! Aynı amaç için aklınızda başka komut satırı teknikleri varsa aşağıdaki geri bildirim bölümümüz aracılığıyla bizimle paylaşmayı unutmayın.