SSH’de mv dosya taşıma komutu ile bir klasöre yeni dosyalar yüklemek istiyorum ancak aynı isimde dosyaların üzerine otomatik olarak yazsın. Her defasında onaylamak uzun sürecektir.
SSH ile mv komutunu kullanırken, aynı isimdeki dosyaların üzerine otomatik olarak yazmak için -f
(force) seçeneğini ekleyebilirsin. Yani:
mv -f kaynak_dosya hedef_klasor/
Buradaki -f
parametresi, hedefte aynı isimde bir dosya varsa uyarı veya onay istemeden doğrudan üzerine yazar. Çok sayıda dosya taşırken bu şekilde zamandan tasarruf edebilirsin.
Eğer birden fazla dosya taşıyacaksan örnek kullanım:
mv -f *.jpg /hedef/klasor/
Ek bilgi:
Standart mv
davranışı genelde zaten var olan dosyanın üzerine sormadan yazar, ama bazı sistem ve shell ayarlarında (örn. alias mv='mv -i'
gibi), onay istenebilir. -f
parametresi bu tür durumları da aşar.
Daha detaylı bilgi veya özel bir senaryo varsa paylaşabilirsin.
asagidaki sekilde hata aliyorum, nasil dogru bir ayar kullanabilirim?
mv -f wordpress/* /home/SITEISMI/public_html
mv: cannot overwrite '/home/SITEISMI/public_html/wp-admin': Directory not empty
mv: cannot overwrite '/home/SITEISMI/public_html/wp-content': Directory not empty
mv: cannot overwrite '/home/SITEISMI/public_html/wp-includes': Directory not empty
Gönderdiğiniz komutlar, bir dizinin içindeki tüm dosya ve klasörleri başka bir dizine taşırken mevcut klasörlerin üzerine yazamıyor çünkü mv komutu klasör içeriğini (yani dolu hedef dizinleri) doğrudan üzerine yazamaz. Özellikle mv, var olan ve boş olmayan dizinlerin üzerine eskiyi silmeden taşıma işlemini gerçekleştirmez.
Neden hata alıyorsunuz?
mv ile bir dosya başka bir dosyanın üzerine yazılabilirken, dolu (içinde dosya olan) bir klasör, yine dolu bir klasörün üzerine düz şekilde taşınamaz. O nedenle “Directory not empty” hatası çıkıyor. -f parametresi de bu durumda işe yaramıyor.
Çözüm yolları:
- Var olan klasörleri önce silmek
Eğer hedefteki klasörlerin tamamen silinmesinde bir sakınca yoksa, taşımadan önce bu klasörleri silmen gerekir:
rm -rf /home/SITEISMI/public_html/wp-admin
rm -rf /home/SITEISMI/public_html/wp-content
rm -rf /home/SITEISMI/public_html/wp-includes
mv wordpress/* /home/SITEISMI/public_html/
Dikkat: rm -rf geri alınamaz, dikkatli ol.
- Klasörlerin içeriğini tek tek kopyalamak
Sadece dosyaların üzerine yazılması isteniyorsa, cp komutunun -a (archive) ve -f (force) parametrelerini kullanabilirsin:
cp -af wordpress/* /home/SITEISMI/public_html/
Bu şekilde, dosya ve klasör yapısı korunarak var olan dosyaların üzerine yazılır ve içi dolu dizinlerde içerik güncellenir. Taşıma işlemi için ardından gerekirse kaynak dizini silebilirsin.
- rsync ile kopyalama (daha güvenli ve esnek)
Alternatif olarak rsync kullanabilirsin:
rsync -av wordpress/ /home/SITEISMI/public_html/
Bu çalışma yöntemiyle dosyalar ve klasörler senkronize edilir, var olanların üzerine yazılır.
Kaynakta olmayan dosyaları, hedeften silerek kopyalama
Kaynakta olup, hedefte olmayan eski dosyaları da beraberinde silmek istiyorsan (dikkat et kullanırken) rsync komutuna --delete parametresini ekleyebilirsin.
rsync -av --delete wordpress/ /home/SITEISMI/public_html/
Sonuç:
Kısacası, mv komutu dolu dizinleri bu şekilde taşıyamaz. Yukarıdaki yöntemlerden hangisi senin işini görüyorsa onu kullanabilirsin. Hangi dosya/klasörlerin korunması veya silinmesi gerektiğini mutlaka kontrol etmelisin.
Başka bir özel senaryon varsa, paylaşabilirsin.
rsync komutu ile dosyaları taşımak daha mantıklı geliyor. Ancak hedefte veritabanı bilgilerini içeren dosyalar var ve bu şekilde yaparsam o dosyalar taşınan klasörde olmadığı için silinir mi? Bu durumda hedefteki dosyaları (taşınan klasörde olmayanlar) koruyan bir yapı verebilir misin?
Evet, rsync’in --delete
parametresi hedefte bulunup kaynakta yer almayan dosya ve klasörleri siler. Yani, örneğin /home/SITEISMI/public_html/
klasöründe olup da wordpress/
klasöründe bulunmayan veritabanı yapılandırma dosyaları gibi dosyalar senin verdiğin komutla silinir.
Eğer hedef dizindeki mevcut, ama kaynakta olmayan dosyaların (örneğin wp-config.php
gibi) kesinlikle korunmasını istiyorsan, rsync komutunda --delete
kullanmamalısın.
Korumak için kullanman gereken rsync komutu:
rsync -av wordpress/ /home/SITEISMI/public_html/
- Böylece sadece kaynakta bulunan dosyalar hedefe kopyalanır ve üzerine yazılır, ama hedefte daha önce var olan ve kaynakta olmayan dosyalara dokunulmaz.
Dikkat Edilecekler
- Eğer bazı dosyaların silinmesini istiyor, bazıların ise mutlaka kalmasını istiyorsan, rsync’ın
--exclude
parametresini kullanarak korumak istediğin dosya/dizinleri hariç tutabilirsin (ama yukarıdaki örnekte buna gerek yok, çünkü silme işlemi yapılmayacak).
Özetle
- Veritabanı dosyalarının ve önemli yapılandırmaların korunmasını istiyorsan,
--delete
kullanma. - Sadece üzerine yazılacak/güncellenecekse:
rsync -av wordpress/ /home/SITEISMI/public_html/
Ayrıca işlemi ilk kez yapıyorsan, mutlaka önemli dosyaların yedeğini almanı öneririm.
Ek bir sorunun olursa buradan devam edebilirsin.