# Bash ile Bir Dosya Hariç Tüm Dosyaları Kopyalama
Veri yedekleme, proje dosyalarının sürüm kontrolü veya sistem yönetimi gibi birçok senaryoda, belirli bir dosyayı hariç tutarak tüm dosyaları kopyalamanız gerekebilir. Bu makale, Bash komut satırı aracını kullanarak bu işlemi nasıl yapacağınızı, yeni başlayanlardan ileri düzey kullanıcılara kadar adım adım açıklayacaktır. Öğrenme yol haritamız ile Bash’in gücünü keşfedecek ve performans optimizasyonunun inceliklerini öğreneceksiniz.
Öğrenme Yol Haritası
Yeni Başlayan: Temel cp komutu ve find komutu ile basit kopyalama işlemleri.
Orta Seviye: find komutunun gelişmiş kullanım örnekleri, -exec ve xargs ile performans optimizasyonu. Gerçek dünya senaryoları ve çözümleri.
İleri Seviye: Performans analizi, karmaşık dosya yapıları ve özel durumlar (edge caseler) ile başa çıkma. rsync komutunun kullanımı ve avantajları.
Bash Temelleri: cp ve find Komutları
Bir dosyayı kopyalamak için en temel Bash komutu cp‘dir. cp kaynak hedef şeklinde kullanılır. Örneğin, dosya1.txt dosyasını yedekler dizinine kopyalamak için: cp dosya1.txt yedekler/. Ancak, birden fazla dosyayı kopyalamak için find komutu çok daha kullanışlıdır. find komutu, belirli kriterlere uyan dosyaları bulmak için kullanılır. find . -name "*.txt" -print komutu, şu anki dizin (./) altında bulunan tüm .txt dosyalarını listeler.
-print seçeneği, bulunan dosyaların isimlerini ekrana yazdırır. Bu komutu cp ile birleştirerek birden fazla dosyayı kopyalayabiliriz, ancak henüz bir dosyayı hariç tutmayı öğrenmedik.
Bir Dosya Hariç Tüm Dosyaları Kopyalama: Yeni Başlayanlar İçin Adım Adım Kılavuz
Diyelim ki, projeler dizini içindeki tüm .txt dosyalarını yedekler dizinine kopyalamak, ancak gizli_dosya.txt dosyasını hariç tutmak istiyoruz. Bunun için find komutunu -not operatörüyle birlikte kullanabiliriz:
find projeler -name "*.txt" -not -name "gizli_dosya.txt" -exec cp {} yedekler/ \;
Bu komut, projeler dizini altında bulunan tüm .txt dosyalarını bulur, gizli_dosya.txt dosyasını hariç tutar (-not -name "gizli_dosya.txt") ve her bir dosyayı ({}) yedekler dizinine kopyalar (cp {} yedekler/). \; sembolü, -exec komutunun sonunu belirtir.
Örnek: projeler dizininde dosya1.txt, dosya2.txt ve gizli_dosya.txt dosyaları olsun. Yukarıdaki komut sadece dosya1.txt ve dosya2.txt dosyalarını yedekler dizinine kopyalar.
Orta Seviye: Gerçek Dünya Senaryoları ve Optimizasyon İpuçları
Şimdi daha gerçekçi bir senaryo ele alalım. Bir web sunucusu üzerinde çalıştığımızı ve /var/www/html dizini altında bulunan tüm dosyaları, backup dizinine yedeklemek, ancak index.html dosyasını hariç tutmak istediğimizi varsayalım. Bu durumda, yukarıdaki komutu doğrudan kullanmak performans sorunlarına yol açabilir, özellikle de çok sayıda dosya varsa. Bu nedenle, xargs komutunu kullanarak işlemi optimize edebiliriz:
find /var/www/html -type f -not -name "index.html" -print0 | xargs -0 cp -t backup/
-print0 ve -0 seçenekleri, dosya isimlerinde boşluk veya özel karakter bulunması durumunda sorunları önlemek için kullanılır. -t seçeneği, cp komutuna hedef dizinin sonuna dosyaları kopyalamasını söyler. Bu yöntem, -exec yöntemine göre genellikle daha hızlıdır.
İleri Düzey: Performans Analizi, Edge Caseler ve rsync
Çok büyük dosya sayıları veya ağ üzerinden kopyalama işlemleri için rsync komutu daha etkilidir. rsync, sadece değiştirilen dosyaları kopyalar, bu da bant genişliği ve zaman tasarrufu sağlar. rsync ile bir dosyayı hariç tutmak için --exclude seçeneğini kullanabiliriz:
rsync -avz --exclude="index.html" /var/www/html/ backup/
Bu komut, /var/www/html dizini altındaki tüm dosyaları backup dizinine kopyalar, ancak index.html dosyasını hariç tutar. -a (arşiv modu), -v (ayrıntılı çıktı), ve -z (sıkıştırma) seçenekleri, kopyalama işlemini daha güvenilir ve verimli hale getirir. [Fatih Soysal’ın web sitesi](https://fatihsoysal.com) üzerindeki performans optimizasyonu makalelerine göz atarak daha fazla bilgi edinebilirsiniz.
Karmaşık Dosya Yapıları ve Özel Durumlar (Edge Caseler)
Bazen, dosya isimlerinde özel karakterler veya boşluklar olabilir. Bu durumlarda, find ve xargs komutlarını -print0 ve -0 seçenekleriyle birlikte kullanmak çok önemlidir. Ayrıca, sembolik linkler veya diğer özel dosya türleriyle nasıl başa çıkacağınızı da bilmeniz gerekir. Bu konuda daha fazla bilgi için Bash dokümanlarına veya [Fatih Soysal’ın](https://fatihsoysal.com) bloguna bakabilirsiniz.
Performans Optimizasyonu
Dosya kopyalama işlemlerinin performansını artırmak için birkaç ipucu:
* xargs kullanın: -exec yerine xargs kullanmak genellikle daha hızlıdır.
* rsync kullanın: Özellikle büyük dosyalar veya ağ üzerinden kopyalama işlemleri için rsync en iyi seçenektir.
* Paralel işlemler: parallel komutu gibi araçları kullanarak işlemleri paralel olarak çalıştırabilirsiniz.
* Sıkıştırma: rsync‘in -z seçeneği veya gzip gibi sıkıştırma araçları kullanarak dosya boyutunu küçültebilirsiniz.
Sonuç
Bu makale, Bash kullanarak bir dosya hariç tüm dosyaları kopyalamanın çeşitli yöntemlerini adım adım açıkladı. Yeni başlayanlar için basit cp ve find komutlarının kullanımından, ileri düzey kullanıcılar için rsync ve performans optimizasyonuna kadar geniş bir yelpazeyi kapsadık. Uygulamada karşılaşabileceğiniz çeşitli senaryolara ve özel durumlara çözümler sunarak, Bash’in gücünü ve esnekliğini gösterdik.
Sıkça Sorulan Sorular:
1. find komutunda -type f ne işe yarar? -type f seçeneği, sadece dosyaları bulmak için kullanılır. Dizileri değil.
2. rsync komutu cp‘den nasıl farklıdır? rsync, sadece değiştirilen dosyaları kopyalar ve ağ üzerinden kopyalama işlemlerinde daha verimlidir.
3. Çok büyük dosyaları kopyalamak için en iyi yöntem nedir? rsync komutu, büyük dosyalar için en iyi performansı sunar.
4. Boşluk içeren dosya isimlerini nasıl kopyalayabilirim? find ve xargs komutlarını -print0 ve -0 seçenekleriyle birlikte kullanın.
5. Hata mesajlarıyla nasıl başa çıkabilirim? Komutların çıktısını inceleyerek ve Bash hata ayıklama tekniklerini kullanarak hataları tespit edebilirsiniz.
Yazar: Fatih Soysal
