mv Komutu: Linux’ta Dosya Taşıma ve Yeniden Adlandırma Rehberi
Linux terminalinde her gün onlarca kez kullandığınız komutlardan biri olan mv, görünürde basit ama arka planda oldukça güçlü bir araçtır. Dosya taşımak, yeniden adlandırmak, dizin yapılarını düzenlemek… Bunların hepsi mv komutuyla halledilebilir. Bu yazıda mv komutunu A’dan Z’ye ele alacağız, gerçek dünya senaryolarıyla pekiştireceğiz.
mv Komutu Nedir?
mv (move) komutu, Linux ve Unix sistemlerinde dosya ve dizinleri taşımak ya da yeniden adlandırmak için kullanılır. cp komutundan farklı olarak kaynağı silip hedefe kopyalamaz; dosyayı doğrudan taşır. Aynı dosya sistemi içinde bu işlem son derece hızlıdır çünkü yalnızca inode referansı güncellenir, veri kopyalanmaz.
Temel sözdizimi:
mv [seçenekler] kaynak hedef
mv [seçenekler] kaynak1 kaynak2 ... hedef_dizin
Temel Kullanım Örnekleri
Dosya Yeniden Adlandırma
En sık kullanılan senaryo: bir dosyanın adını değiştirmek.
# Tek bir dosyayı yeniden adlandır
mv eski_isim.txt yeni_isim.txt
# Bir scripti yeniden adlandır
mv deploy.sh deploy_v2.sh
# Log dosyasını tarih ekleyerek arşivle
mv uygulama.log uygulama_2024_01_15.log
Burada dikkat edilmesi gereken nokta şu: eğer yeni_isim.txt zaten varsa, mv varsayılan olarak üzerine yazar. Bu davranış önemli, aşağıda bunu nasıl kontrol altına alacağımızı göreceğiz.
Dosya Taşıma
# Dosyayı başka bir dizine taşı
mv rapor.pdf /home/ahmet/belgeler/
# Birden fazla dosyayı aynı anda taşı
mv dosya1.txt dosya2.txt dosya3.txt /tmp/yedek/
# Tüm .log dosyalarını arşiv klasörüne taşı
mv /var/log/nginx/*.log /var/log/nginx/arsiv/
Dizin Taşıma ve Yeniden Adlandırma
mv komutu dizinlerde de aynen çalışır, cp -r gibi özyinelemeli bayrak gerektirmez.
# Dizini yeniden adlandır
mv proje_eski proje_yeni
# Dizini başka bir yere taşı
mv /home/ahmet/indirmeler /home/ahmet/arsiv/2024/
# Web uygulaması klasörünü taşı
mv /tmp/uygulama_v2 /var/www/html/uygulama
mv Komutunun Önemli Seçenekleri
-i (Interactive) Bayrağı
Üzerine yazma işlemlerinde onay ister. Üretim ortamında çalışırken bu bayrağı kullanmayı alışkanlık haline getirmenizi şiddetle tavsiye ederim.
mv -i onemli_veri.db /backup/onemli_veri.db
# Çıktı: mv: '/backup/onemli_veri.db' dosyasının üzerine yazılsın mı? (e/h)
-n (No-clobber) Bayrağı
Var olan dosyaların üzerine hiçbir şekilde yazılmamasını sağlar. -i‘dan farkı: onay istemez, sessizce işlemi atlar.
# Hedefte var olan dosyaların üzerine yazma
mv -n yedek/*.sql /var/db/yedekler/
# Test edelim
touch hedef.txt
mv -n kaynak.txt hedef.txt
# hedef.txt zaten var, kaynak.txt yerinde kalır, sessizce atlanır
-f (Force) Bayrağı
Tüm uyarıları bastırır ve onay istemeden üzerine yazar. Script yazarken -i ile çakışmasın diye kullanılır.
# Alias tanımlıysa bile zorla çalıştır
mv -f eski_config.conf /etc/uygulama/config.conf
-u (Update) Bayrağı
Kaynak dosya hedeften daha yeniyse taşır, değilse atlar. Yedekleme scriptlerinde son derece kullanışlıdır.
# Sadece daha yeni dosyaları taşı
mv -u /kaynak/dizin/* /hedef/dizin/
# Yedekleme senaryosunda güncellenen dosyaları taşı
mv -u /var/www/html/uploads/* /backup/uploads/
-v (Verbose) Bayrağı
Her işlemi ekrana yazdırır. Toplu taşıma işlemlerinde ne olduğunu takip etmek için kullanın.
mv -v *.log /var/log/arsiv/
# Çıktı:
# 'access.log' -> '/var/log/arsiv/access.log'
# 'error.log' -> '/var/log/arsiv/error.log'
# 'mysql.log' -> '/var/log/arsiv/mysql.log'
–backup Bayrağı
Hedef dosya mevcutsa yedek oluşturur, sonra üzerine yazar. Çok güvenli bir yaklaşım.
# Tilde (~) ile yedek oluşturur
mv --backup=simple config.conf /etc/uygulama/config.conf
# /etc/uygulama/config.conf~ olarak yedek oluşturulur
# Numaralı yedek için
mv --backup=numbered config.conf /etc/uygulama/config.conf
# config.conf.~1~ şeklinde oluşturulur
Gerçek Dünya Senaryoları
Senaryo 1: Web Sunucusu Güncelleme Deploy İşlemi
Yeni bir uygulama sürümünü canlıya almadan önce mevcut sürümü yedeklemek ve yenisini yerine koymak klasik bir senaryodur.
#!/bin/bash
# deploy.sh - Basit bir deploy scripti
APP_DIR="/var/www/html/uygulama"
BACKUP_DIR="/var/www/html/yedekler"
NEW_VERSION="/tmp/uygulama_v2"
TARIH=$(date +%Y%m%d_%H%M%S)
# Mevcut sürümü yedekle
echo "Mevcut sürüm yedekleniyor..."
mv -v "$APP_DIR" "$BACKUP_DIR/uygulama_$TARIH"
# Yeni sürümü canlıya al
echo "Yeni sürüm canlıya alınıyor..."
mv -v "$NEW_VERSION" "$APP_DIR"
echo "Deploy tamamlandı!"
echo "Yedek konumu: $BACKUP_DIR/uygulama_$TARIH"
Bu scriptte dikkat edin: mv işlemi aynı dosya sistemi içinde gerçekleştiği için neredeyse anlık tamamlanır. Büyük bir Node.js uygulamasını bile saniyeler içinde canlıya alabilirsiniz.
Senaryo 2: Log Dosyalarını Düzenli Arşivleme
Sistem yöneticilerinin en sevmediği iş: disk dolduran log dosyaları. Cron ile birlikte mv kullanarak otomatik arşivleme yapabilirsiniz.
#!/bin/bash
# log_arsivle.sh
LOG_DIR="/var/log/uygulama"
ARSIV_DIR="/var/log/arsiv"
TARIH=$(date +%Y_%m)
# Aylık arşiv klasörü oluştur
mkdir -p "$ARSIV_DIR/$TARIH"
# Geçen ayın log dosyalarını taşı
# Örneğin: uygulama_2024_01_*.log formatındaki dosyalar
GECEN_AY=$(date -d "last month" +%Y_%m)
mv -v "$LOG_DIR"/uygulama_${GECEN_AY}_*.log "$ARSIV_DIR/$TARIH/" 2>/dev/null
# Taşınan dosya sayısını raporla
DOSYA_SAYISI=$(ls "$ARSIV_DIR/$TARIH/" 2>/dev/null | wc -l)
echo "$(date): $DOSYA_SAYISI log dosyası arşivlendi" >> /var/log/arsivleme.log
Crontab’a eklemek için:
# Her ayın 1'inde gece yarısı çalıştır
0 0 1 * * /usr/local/bin/log_arsivle.sh
Senaryo 3: Toplu Dosya Yeniden Adlandırma
Klasik senaryo: bir projede tüm .txt dosyalarının uzantısını .md yapmak. mv tek başına bunu yapamaz ama döngüyle kolayca çözülür.
# Bash döngüsüyle toplu yeniden adlandırma
for dosya in /proje/docs/*.txt; do
yeni_isim="${dosya%.txt}.md"
mv -v "$dosya" "$yeni_isim"
done
Daha gelişmiş bir örnek: boşluk içeren dosya isimlerini alt çizgiyle değiştirme.
# Dosya isimlerindeki boşlukları alt çizgiyle değiştir
find /home/ahmet/belgeler -name "* *" -type f | while IFS= read -r dosya; do
yeni_isim=$(echo "$dosya" | tr ' ' '_')
mv -v "$dosya" "$yeni_isim"
done
Senaryo 4: Konfigürasyon Dosyası Güvenli Güncelleme
Üretim sunucusunda bir konfigürasyon dosyasını güncellerken yedek almayı unutmak büyük felaketlere yol açabilir.
#!/bin/bash
# Güvenli config güncelleme
CONFIG_DOSYASI="/etc/nginx/nginx.conf"
YENI_CONFIG="/tmp/nginx.conf.yeni"
YEDEK_DIR="/etc/nginx/yedekler"
TARIH=$(date +%Y%m%d_%H%M%S)
# Yedek dizini oluştur
mkdir -p "$YEDEK_DIR"
# Mevcut config'i yedekle
mv -v "$CONFIG_DOSYASI" "$YEDEK_DIR/nginx.conf.$TARIH"
# Yeni config'i yerleştir
mv -v "$YENI_CONFIG" "$CONFIG_DOSYASI"
# Nginx konfigürasyonunu test et
if nginx -t 2>/dev/null; then
echo "Konfigürasyon geçerli, reload yapılıyor..."
systemctl reload nginx
else
echo "HATA: Konfigürasyon geçersiz! Eski sürüm geri yükleniyor..."
mv -v "$CONFIG_DOSYASI" "$YENI_CONFIG.hatalı"
mv -v "$YEDEK_DIR/nginx.conf.$TARIH" "$CONFIG_DOSYASI"
fi
Dikkat Edilmesi Gereken Durumlar
Farklı Dosya Sistemleri Arasında Taşıma
Aynı dosya sistemi içinde mv çok hızlıdır çünkü sadece inode güncellenir. Ancak farklı dosya sistemleri arasında taşıma yaparken arka planda cp + rm işlemi gerçekleşir. Bu büyük dosyalar için zaman alabilir.
# /home ile /backup farklı disk bölümlerindeyse bu yavaş çalışır
mv /home/ahmet/buyuk_dosya.tar.gz /backup/buyuk_dosya.tar.gz
# Büyük dosya taşırken ilerlemeyi görmek için rsync kullanın
rsync --progress --remove-source-files /kaynak/buyuk_dosya.tar.gz /hedef/
Dizin İçine mi Yoksa Yeniden Adlandırma mı?
Bu en sık karışıklığa yol açan durumlardan biridir.
# Senaryo: 'hedef' adında bir dizin varsa
mkdir hedef
mv kaynak.txt hedef # kaynak.txt -> hedef/kaynak.txt (içine taşır!)
mv kaynak.txt hedef_yeni # Hedef_yeni yoksa: yeniden adlandırır
Bunu önlemek için hedef yolu açık belirtin:
# Açık hedef yolu belirt
mv kaynak.txt hedef/kaynak.txt
İzin Sorunları
mv işlemi için kaynak dosyada yazma iznine değil, üst dizinin yazma iznine ihtiyaç duyarsınız.
# Kaynak dizinde yazma izni olmasa bile çalışabilir
# Ama kaynak dizinin üst dizininde yazma izni şart
# Örnek: /var/log altındaki bir dosyayı taşımak için root gerekir
sudo mv /var/log/auth.log /var/log/arsiv/auth_2024.log
Joker Karakter Kullanımında Dikkat
# TEHLİKELİ: Yanlış kullanım
mv * /backup/ # Mevcut dizindeki HER ŞEYİ taşır, gizli dosyalar dahil değil
# Daha güvenli: önce neyin taşınacağını test et
ls *.log # Önce listele
mv -v *.log /backup/ # Sonra taşı
# Gizli dosyaları da dahil etmek için
mv .* * /backup/ # Dikkatli olun! . ve .. da eşleşir
mv ile İlgili Pratik İpuçları
Alias Tanımlamaları
Çoğu Linux dağıtımında mv‘ye mv -i alias’ı tanımlanmıştır. Bunu kontrol edin:
# Alias'ları kontrol et
alias mv
# Çıktı: alias mv='mv -i'
# Alias'ı atlamak için
mv kaynak.txt hedef.txt
# veya
command mv kaynak.txt hedef.txt
Hızlı Yedek Alma Tekniği
# Dosyayı düzenlemeden önce hızlıca yedek al
cp nginx.conf nginx.conf.bak && mv nginx.conf.yeni nginx.conf
# Daha kısa yol: brace expansion ile
cp nginx.conf{,.bak} # nginx.conf.bak oluşturur
mv nginx.conf.yeni nginx.conf
Önceki Dizine Geri Taşıma
# Yanlışlıkla taşıdığınız dosyayı geri al
mv dosya.txt /yanlis/dizin/
mv /yanlis/dizin/dosya.txt . # Geri al
# Daha pratik: $OLDPWD kullan
mv /yanlis/dizin/dosya.txt $OLDPWD/
mv ile Sık Yapılan Hatalar ve Çözümleri
Hata 1: “cannot move: are the same file”
mv dosya.txt dosya.txt
# mv: 'dosya.txt' ve 'dosya.txt' aynı dosya
# Çözüm: farklı isim kullan
mv dosya.txt dosya_yedek.txt
Hata 2: “cannot move: directory not empty”
Bu hata aslında farklı bir durumda ortaya çıkar: hedef dizin varsa ve kaynak bir dizinse.
# Sorun: hedef dizini zaten mevcut ve içi dolu
mv /kaynak/dizin /hedef/dizin
# Hedef varsa: /hedef/dizin/dizin şeklinde içine taşır
# İstediğiniz: içerikleri birleştirmek
# mv bunu yapamaz, rsync veya cp kullanın
rsync -av --remove-source-files /kaynak/dizin/ /hedef/dizin/
Hata 3: Dosya İsimlerinde Özel Karakterler
# Tire ile başlayan dosya ismi
mv -dosyam.txt yeni.txt # Hata! -dosyam seçenek olarak algılanır
# Çözüm 1: -- kullan
mv -- -dosyam.txt yeni.txt
# Çözüm 2: ./ ile başlat
mv ./-dosyam.txt yeni.txt
Özet Tablo
| Seçenek | Açıklama | Ne Zaman Kullanmalı | |———|———-|———————| | -i | Üzerine yazmadan önce sor | Manuel işlemlerde her zaman | | -n | Var olan dosyaların üzerine yazma | Toplu taşımada güvenlik için | | -f | Zorla, onay isteme | Scriptlerde alias’ı atlamak için | | -u | Sadece daha yeni dosyaları taşı | Yedekleme scriptlerinde | | -v | Her işlemi ekrana yaz | Debug ve takip için | | --backup | Üzerine yazmadan önce yedekle | Kritik dosyalarda |
Sonuç
mv komutu Linux dünyasının en temel araçlarından biri olmakla birlikte, doğru kullanılmadığında veri kaybına neden olabilecek güçlü bir komuttur. Bu yazıda öğrendiklerimizi özetleyelim:
- Üretim ortamında her zaman
-iveya--backupbayrağını kullanın. - Script yazarken
-fbayrağıyla alias çakışmalarını önleyin ve-vile işlemleri loglamayı unutmayın. - Farklı dosya sistemleri arasında büyük dosya taşırken
rsyncdaha iyi bir seçenek olabilir. - Joker karakter kullanmadan önce
lsile neyin eşleştiğini kontrol edin. - Dizin mi yoksa yeniden adlandırma mı sorusunu kendinize her seferinde sorun; hedef yolunu açık belirtin.
Bir sysadmin olarak mv komutunu refleks gibi kullanıyor olabilirsiniz, ancak bu “refleks”in yanlış bir anda tetiklenmesi saatlerce süren kurtarma işlemlerine yol açabilir. Küçük önlemler büyük kazalar önler.
Komutun man sayfasını okumayı da ihmal etmeyin:
man mv
# veya daha kısa bilgi için
mv --help
Sorularınız veya eklemek istedikleriniz varsa yorumlarda buluşalım!
