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 -i veya --backup bayrağını kullanın.
  • Script yazarken -f bayrağıyla alias çakışmalarını önleyin ve -v ile işlemleri loglamayı unutmayın.
  • Farklı dosya sistemleri arasında büyük dosya taşırken rsync daha iyi bir seçenek olabilir.
  • Joker karakter kullanmadan önce ls ile 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!

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir