15%

Tüm Hosting Hizmetlerinde %15 indirim

Becerilerini test et ve herhangi bir hosting planında İndirim kazan

Kodu kullanın:

Skills
Başlayın
15.12.2023

Linux’ta Bir Klasördeki Tüm Dosyaları Silme: Eksiksiz Teknik Kılavuz

Linux’ta dosya silmek, dosyaları dosya sisteminden kalıcı olarak kaldırmak anlamına gelir; yerel bir geri dönüşüm kutusu veya geri alma mekanizması yoktur. Bu işlemin temel aracı rm komutudur; buna ek olarak find, rsync ve kabuk glob genişletmesi de kullanılır — her biri tek dosya kaldırmadan milyonlarca inode üzerinde toplu, ölçüt tabanlı temizliğe kadar farklı senaryolara uygundur.

Linux dosya silme işlemi varsayılan olarak geri alınamaz olduğundan, her yöntemin tam davranışını anlamak — sembolik bağlantıları, gizli dosyaları, bağlama noktalarını ve açık dosya tanımlayıcılarını nasıl ele aldıkları dahil — isteğe bağlı değildir. Bu, temiz bir bakım görevi ile üretim ortamında yıkıcı veri kaybı arasındaki farktır.

Linux’ta Dosya Silmenin Neden Hassasiyet Gerektirdiği

rm ile bir dosyayı sildiğinizde, çekirdek dosyanın sabit bağlantı sayısını azaltır. Gerçek veri blokları yalnızca bu sayı sıfıra ulaştığında ve hiçbir işlem inode’a açık bir dosya tanımlayıcısı tutmadığında serbest bırakılır. Bunun iki pratik sonucu vardır:

  • Çalışan bir işlem, dosya tanımlayıcısını silmeden önce açmışsa “silinmiş” bir dosyayı okumaya devam edebilir. Disk alanı, işlem kapatılana veya sonlandırılana kadar geri kazanılmaz.
  • Bir dizin girişini silmek, yoğun sistemlerde anında disk alanı kurtarımını garanti etmez.

Birden fazla hizmetin aynı dosya sistemini paylaştığı bir VPS Hosting ortamında veya Dedicated Server‘da, bu davranışı anlamak büyük bir silme işleminin ardından df‘ın neden serbest alan göstermediğine dair karışıklığı önler.

Yöntem 1: rm ile Temel Dosya Silme

rm komutu, dosyaları ve dizin girişlerini kaldırmak için standart POSIX yardımcı programıdır.

rm /path/to/filename

Temel bayraklar:

BayrakDavranış
-fZorla silme; var olmayan dosyalar için hataları bastırır ve hiçbir zaman onay istemez
-iEtkileşimli mod; her silme işleminden önce onay ister
-I3’ten fazla dosya kaldırmadan veya özyinelemeli işlem yapmadan önce bir kez onay ister
-vAyrıntılı mod; kaldırılan her dosya adını yazdırır
-r / -RÖzyinelemeli; dizinleri ve tüm içeriklerini kaldırır

Dizinin kendisini silmeden içindeki tüm dosyaları silme:

rm /path/to/folder/*

Kritik tuzak — gizli dosyalar * tarafından eşleştirilmez: * glob’u noktalı dosyalara (. ile başlayan dosyalar) genişlemez. Gizli dosyaları da kaldırmak için:

rm /path/to/folder/* /path/to/folder/.[!.]* /path/to/folder/..?*

.[!.]* deseni . ve .. dışındaki tüm noktalı dosyaları eşleştirir. ..?* deseni ..foo gibi uç durumları yakalar. Bu desenlerin atlanması, uygulama yapılandırma dizinlerini temizlerken yapılan en yaygın hatalardan biridir.

Yöntem 2: rm -r ile Özyinelemeli Silme

Bir dizini ve içindeki her şeyi — dosyalar, alt dizinler ve içerikleri — kaldırmak için:

rm -r /path/to/folder/

Bu, dizin ağacını derinlik öncelikli olarak gezer ve dosyaları üst dizinlerinden önce kaldırır. Çok derin ağaçlarda rm -r çekirdeğin özyineleme yığın sınırına ulaşabilir, ancak bu pratikte nadirdir.

Betiklerde etkileşimsiz kullanım için -f ile birleştirme:

rm -rf /path/to/folder/

Bu, Linux sistem yönetimindeki en tehlikeli kombinasyondur. Sembolik bağlantılar (hedefleri değil), özel dosyalar ve dizinler dahil olmak üzere belirtilen yol altındaki her şeyi herhangi bir onay olmadan siler. Yedek olmadan kurtarma yolu yoktur.

Gerçek dünya uç durumu: Bir betikte yolun önüne yanlışlıkla boşluk eklerseniz:

rm -rf $TARGET_DIR /

$TARGET_DIR boş veya tanımsızsa ve kabukta nounset (set -u) etkin değilse, bu rm -rf /‘a genişler ve kök dosya sistemini silmeye çalışır. Üretim betiklerinde her zaman set -u kullanın ve değişkenleri tırnak içine alın: "$TARGET_DIR".

Yöntem 3: find ile Ölçüt Tabanlı Silme

find komutu, dosyaları yalnızca ada göre değil özelliklerine göre silmeniz gerektiğinde doğru araçtır. rm‘ın tek başına sunamayacağı cerrahi hassasiyeti sağlar.

Bir dizindeki yalnızca normal dosyaları silme (özyinelemesiz):

find /path/to/folder -maxdepth 1 -type f -delete

30 günden eski dosyaları silme:

find /path/to/folder -type f -mtime +30 -delete

100 MB’tan büyük dosyaları silme:

find /path/to/folder -type f -size +100M -delete

Belirli bir uzantıyla eşleşen dosyaları silme:

find /path/to/folder -type f -name "*.log" -delete

İçerikleri temizlendikten sonra boş dizinleri silme:

find /path/to/folder -type d -empty -delete

find -exec rm ile find -delete Karşılaştırması

YaklaşımMekanizmaPerformansGüvenlik
find ... -exec rm {} ;Dosya başına yeni bir rm işlemi başlatırBüyük dosya sayılarında yavaş (fork yükü)Biraz daha taşınabilir
find ... -exec rm {} +Dosyaları tek bir rm çağrısında toplu işlerÇok daha hızlı; xargs‘e benzerTaşınabilir, verimli
find ... -deletefind‘dan doğrudan çekirdek unlinkat() çağrısıEn hızlı; alt işlem yokDizinler için -depth sıralaması gerektirir

Binlerce dosyayla uğraşırken -exec rm {} ; yerine her zaman -delete veya -exec rm {} + tercih edin. Noktalı virgül formunun dosya başına fork() yükü, 100.000 dosyalık bir temizliğin saniyeler yerine dakikalar sürmesine neden olabilir.

Önemli sıralama kuralı: Tek bir find geçişinde hem dosyaları hem de üst dizinlerini kaldırmak için -delete kullanırken, dizin içeriklerini dizinin kendisinden önce işlemek için her zaman -depth ekleyin:

find /path/to/folder -depth -delete

-depth olmadan, find bir dizini içeriklerinden önce silmeye çalışabilir ve Directory not empty hatalarına neden olabilir.

Yöntem 4: bash ile Kabuk Glob Genişletmesini Kullanma

Harici işlemler başlatmadan bir dizinin içeriğini boşaltmak istediğiniz senaryolarda, Bash’in yerleşik glob genişletmesi ile rm kombinasyonu verimlidir:

shopt -s dotglob nullglob
rm -rf /path/to/folder/*/
rm -f /path/to/folder/*
shopt -u dotglob nullglob
  • dotglob, *‘ın gizli dosyaları da kapsamasını sağlar.
  • nullglob, dizin zaten boşsa rm‘ın gerçek bir * almasını engeller; bu durum hataya neden olurdu.

Yöntem 5: rsync ile Yüksek Performanslı Silme

Bir dizin milyonlarca dosya içerdiğinde, rm -rf her inode’u tek tek stat() ve unlink() yapmak zorunda olduğundan son derece yavaş olabilir. Bilinen bir sistem yöneticisi tekniği, boş bir dizini hedefin üzerine senkronize etmek için rsync kullanmaktır:

mkdir /tmp/empty_dir
rsync -a --delete /tmp/empty_dir/ /path/to/folder/
rmdir /tmp/empty_dir

rsync, son derece optimize edilmiş dizin geçişi kullanır ve posta kutuları, oturum önbellekleri ve PHP oturum dizinlerinde yaygın olan milyonlarca küçük dosya içeren dosya sistemlerinde rm -rf‘ı geride bırakabilir. Bu, yüksek trafikli uygulamalar çalıştıran herhangi bir Dedicated Server‘da pratik bir tekniktir.

Yöntem 6: Dosyaları Silmeden İçeriklerini Temizleme

Bazen inode’u kaldırmadan bir dosyanın içeriğini temizlemeniz gerekir — özellikle çalışan bir daemon’ın açık tuttuğu günlük dosyaları için. Dosyayı silip yeniden oluşturmak açık dosya tanımlayıcısını bozar.

İnode’u koruyarak sıfır bayta kırpma:

> /path/to/logfile.log

Ya da eşdeğer olarak:

truncate -s 0 /path/to/logfile.log

Bu, canlı bir sunucuda aktif günlük dosyalarını temizlemenin doğru yoludur. Açık bir günlük dosyasında rm kullanmak dizin girişini serbest bırakır, ancak daemon artık görünmez olan inode’a yazmaya devam eder ve işlem yeniden başlatılana kadar disk alanı tüketir.

Tüm Silme Yöntemlerinin Karşılaştırması

YöntemGizli Dosyaları KaldırırÖzyinelemeliÖlçüt TabanlıBüyük Kümelerde PerformansRisk Düzeyi
rm fileGeçersizHayırHayırYüksekDüşük
rm *Hayır (dotglob olmadan)HayırHayırYüksekOrta
rm -rf dir/EvetEvetHayırOrtaÇok Yüksek
find -deleteEvetYapılandırılabilirEvetYüksekOrta
find -exec rm {} +EvetYapılandırılabilirEvetOrta-YüksekOrta
rsync --deleteEvetEvetHayırÇok Yüksek (milyonlarca dosya)Düşük
truncate / >GeçersizHayırHayırÇok YüksekÇok Düşük

İzinler, Sahiplik ve Yapışkan Bit

Linux’ta dosya silme işlemi, dosya izinleri değil dizin izinleri tarafından yönetilir. Bir dosyayı silmek için dosyanın kendisinde değil, üst dizinde yazma (w) ve çalıştırma (x) izinlerine ihtiyacınız vardır. Bu durum, başka bir kullanıcıya ait bir dizin içinde kendilerine ait bir dosyayı silemediklerini fark eden birçok kullanıcıyı şaşırtır.

Yapışkan bit (chmod +t /dir), bir dizinde (en çok /tmp ile bilinir) silme işlemini kısıtlar; böylece dizin yazma izinlerinden bağımsız olarak yalnızca dosyanın sahibi, dizinin sahibi veya root dosyaları kaldırabilir. Bu, paylaşımlı hosting ortamlarında kritik öneme sahiptir.

Bir Shared Web Hosting platformunda, yapışkan bit ve uygun dizin sahipliği, bir kullanıcının betiklerinin paylaşımlı geçici dizinlerde başka bir kullanıcının dosyalarını silmesini önleyen şeydir.

Silme İşlemlerini Gerçekleştirmeden Önce Güvenli Önizleme

Üretim ortamında herhangi bir yıkıcı komut çalıştırmadan önce neyin silineceğini önizleyin:

Silmeden önce find ile önizleme:

find /path/to/folder -type f -mtime +30

Önce -delete olmadan çalıştırın. Etkilenen dosyaları saymak için wc -l üzerinden aktarın:

find /path/to/folder -type f -mtime +30 | wc -l

rsync ile kuru çalıştırma:

rsync -a --delete --dry-run /tmp/empty_dir/ /path/to/folder/

Glob genişletmesini doğrulamak için ls kullanın:

ls /path/to/folder/* /path/to/folder/.[!.]*

Bu adımı hiçbir zaman varsayımlarla atlamamalısınız; özellikle ortam değişkenlerinin yolları tanımladığı sistemlerde.

Temizlik Görevlerini Güvenli Şekilde Otomatikleştirme

Üretim sunucularında — ister VPS Hosting örnekleri ister bare-metal Dedicated Servers olsun — otomatik temizlik genellikle cron veya systemd zamanlayıcıları aracılığıyla yönetilir. Sağlam bir temizlik betiği şu ilkeleri izlemelidir:

#!/bin/bash
set -euo pipefail

TARGET="/var/app/cache"

# Validate target is not empty and is a directory
if [[ -z "$TARGET" || ! -d "$TARGET" ]]; then
    echo "ERROR: Invalid target directory." >&2
    exit 1
fi

# Delete files older than 7 days
find "$TARGET" -type f -mtime +7 -delete
echo "Cleanup complete: $TARGET"

Bu betikteki temel savunma önlemleri:

  • set -euo pipefail — herhangi bir hatada çıkar, tanımsız değişkenleri hata olarak ele alır ve boru hatalarını yakalar.
  • Herhangi bir silme işleminden önce açık dizin doğrulaması.
  • Sözcük bölünmesini önlemek için betik boyunca tırnak içine alınmış değişkenler.

Bir kontrol paneli aracılığıyla yönetilen web uygulamaları için, VPS with cPanel bir GUI üzerinden cron iş yönetimi sağlar ve zamanlanmış silme görevlerinde sözdizimi hatası riskini azaltır.

Dosya Sistemine Özgü Değerlendirmeler

Farklı Linux dosya sistemleri silme işlemini farklı şekilde ele alır ve bu durum hem performansı hem de kurtarılabilirliği etkiler:

  • ext4: Günlük kullanır. Silinen dosya meta verileri, inode serbest bırakılmadan önce günlüğe kaydedilir. Bazı adli araçlar, ext4 günlüklerinden yakın zamanda silinen dosyaları kurtarabilir.
  • XFS: Büyük dosyalar ve yüksek verimli silme için optimize edilmiştir. B-ağacı dizin indekslemesi sayesinde XFS üzerinde milyonlarca dosyayla rm -rf işlemi ext4’e kıyasla önemli ölçüde daha hızlıdır.
  • Btrfs: Anlık görüntüleri destekler. Btrfs alt birimindeki bir dosyayı silmek, bir anlık görüntü aynı veri bloklarına başvuruyorsa alan serbest bırakmaz. Disk alanı kurtarımı beklemeden önce her zaman btrfs subvolume list ile anlık görüntü kullanımını kontrol edin.
  • tmpfs: Bellek içi dosya sistemi. Silme işlemi anlıktır ve alan hemen geri kazanılır. Genellikle /tmp ve oturum depolama için kullanılır.
  • NFS bağlamaları: NFS üzerinden dosya silmek, uzak bir işlem dosyayı açık tutuyorsa .nfsXXXXXX geçici dosyaları oluşturur. Bunlar, uzak dosya tanımlayıcısı kapatıldığında temizlenir.

Linux Sunucusunda Dosya Silmeden Önce Teknik Kontrol Listesi

  • Herhangi bir rm komutu çalıştırmadan önce pwd ve ls ile tam yolu doğrulayın.
  • Dosya listesini önizlemek için -delete olmadan önce find kullanın.
  • Aktif uygulama dizinlerindeki dosyaları silmeden önce lsof +D /path/to/folder ile açık dosya tanımlayıcılarını kontrol edin.
  • Çalışan hiçbir işlemin dizine bağımlı olmadığını fuser -m /path/to/folder ile doğrulayın.
  • Btrfs’te disk alanının serbest bırakılmasını beklemeden önce anlık görüntüleri kontrol edin.
  • Tüm otomatik silme betiklerinde set -euo pipefail kullanın.
  • Yanlışlıkla kök düzeyinde silmeyi önlemek için betiklerdeki tüm değişkenleri tırnak içine alın.
  • Daemon’lar tarafından açık tutulan günlük dosyaları için rm yerine kırpma (> veya truncate -s 0) kullanın.
  • Paylaşımlı sistemlerde, silme işleminin başarılı olacağını varsaymadan önce dizin izinlerini ve yapışkan bit ayarlarını doğrulayın.
  • Güncel yedekler tutun. Hiçbir silme yöntemi, doğrulanmış bir kurtarma yolu olmadan güvenli değildir.

SSS

S: rm -rf /path/to/folder/* gizli dosyaları siler mi?

Bash’te dotglob etkinleştirilmeden, * glob’u nokta ile başlayan dosyalara genişlemez. .env, .htaccess ve .gitignore gibi gizli dosyalar geride kalır. Komuttan önce shopt -s dotglob kullanın veya glob desene açıkça .[!.]* ekleyin.

S: Büyük dosyaları sildikten sonra neden disk alanı hemen serbest kalmıyor?

Çalışan bir işlem silinen dosyaya açık bir dosya tanımlayıcısı tutuyorsa, çekirdek o dosya tanımlayıcısı kapatılana kadar veri bloklarını tahsis edilmiş tutar. Açık silinen dosyaları tutan işlemleri belirlemek için lsof | grep deleted kullanın. İlgili hizmeti veya işlemi yeniden başlatmak alanı serbest bırakır.

S: Milyonlarca dosya içeren bir dizini boşaltmanın en güvenli yolu nedir?

rsync --delete yöntemi (boş bir dizini hedefin üzerine senkronize etmek) genellikle çok büyük dosya sayıları için en performanslı ve en az hata eğilimli yaklaşımdır. rm *‘ın karşılaşabileceği kabuk argüman listesi uzunluk sınırından (E2BIG) kaçınır ve çoğu dosya sisteminde dosya başına rm çağrılarından daha hızlıdır.

S: Linux’ta silinen dosyalar kurtarılabilir mi?

Varsayılan olarak Linux’un geri dönüşüm kutusu yoktur. Ancak ext4 dosya sistemlerinde, silme işleminden bu yana diske yoğun yazma yapılmamışsa extundelete veya testdisk gibi araçlar kullanılarak yakın zamanda silinen dosyalar kurtarılabilir. Anlık görüntüler etkinleştirilmiş Btrfs’te, kurtarma anlık görüntü geri alımı yoluyla kolaydır. Bu nedenle yedek tutmak, herhangi bir üretim ortamında vazgeçilmezdir.

S: Dizinin kendisini silmeden içindeki dosyaları nasıl silebilirim?

Üst dizini korurken gizli dosyalar ve alt dizinler dahil tüm içerikleri kaldırmak için find /path/to/folder -mindepth 1 -delete kullanın. Alternatif olarak, dotglob etkinleştirilmiş rm -rf /path/to/folder/* yalnızca üst düzey için aynı sonucu elde eder.

15%

Tüm Hosting Hizmetlerinde %15 indirim

Becerilerini test et ve herhangi bir hosting planında İndirim kazan

Kodu kullanın:

Skills
Başlayın