mv Komutu: Linux’ta Dosya Tasima ve Yeniden Adlandirma Rehberi

mv Komutu: Dosya Tasima ve Yeniden Adlandirma Rehberi

Eger Linux’ta dosyalarla calisiyorsaniz, gunun birinde mv komutunu kullanmak zorunda kalacaksiniz. Aslinda “gunun birinde” degil, her gun kullanacaksiniz. mv komutu basit gorunse de arka planda ne yaptigini, hangi senaryolarda nasil davrandigini ve hangi tuzaklara dusulebilecegini bilmek, hem zaman kazandirir hem de felaket senaryolarinin onune gecer.

Bu yazida mv komutunu A’dan Z’ye ele alacagiz. Temel kullanim seklinden baslayip gercek dunya senaryolarina kadar her seyi konusacagiz.

mv Komutu Nedir ve Nasil Calisir?

mv (move kelimesinden gelir) komutu iki temel is yapar:

  • Dosya veya dizin tasima: Bir dosyayi bir konumdan baska bir konuma tasir.
  • Yeniden adlandirma: Ayni dizin icinde farkli bir isim verir.

Ama arka planda ne olup bittigi onemli. Ayni dosya sistemi uzerinde bir dosyayi tasidginizda, mv aslinda dosyanin icerigini kopyalamaz. Sadece dizin girisini gunceller. Bu neden onemli? Cunku cok buyuk dosyalari bile neredeyse aninda tasiyabilirsiniz. Ancak farkli dosya sistemleri arasinda tasima yaptiginda (ornegin /home’dan /mnt/disk2’ye), mv once kopyalar, sonra orijinali siler. Bu durumda islem surebilir.

Temel Kullanim

Syntax son derece basit:

mv [secenekler] kaynak hedef

Dosya Yeniden Adlandirma

# Basit yeniden adlandirma
mv eski_dosya.txt yeni_dosya.txt

# Bir scripti yeniden adlandirma
mv deploy.sh deploy_v2.sh

# Uzantisiz dosyaya uzanti ekleme
mv config config.yaml

Dosya Tasima

# Dosyayi baska bir dizine tasima
mv rapor.pdf /home/ahmet/belgeler/

# Birden fazla dosyayi ayni anda tasima
mv dosya1.txt dosya2.txt dosya3.txt /tmp/arsiv/

# Wildcard kullanarak belirli dosyalari tasima
mv *.log /var/log/eski_loglar/

Onemli Secenekler

-i (Interactive – Interaktif Mod)

Bu secenek hayat kurtarir. Hedefte ayni isimde bir dosya varsa, uzerine yazmadan once sizi uyarir.

mv -i onemli_dosya.txt /var/backup/

# Terminal size sorar:
# mv: overwrite '/var/backup/onemli_dosya.txt'? (y/n)

Production ortaminda calisirken bu secenegi alisvanlk haline getirmenizi siddetle tavsiye ederim. Bir an dikkatsizlik, yedeklenemeyen bir dosyanin uzerine yazilmasina neden olabilir.

-n (No Clobber – Uzerine Yazma)

Hedefte dosya varsa hic dokunmaz, sessizce gecer:

mv -n yeni_config.conf /etc/myapp/config.conf
# Eger /etc/myapp/config.conf zaten varsa, hic bir sey yapmaz

-b (Backup – Yedek Al)

Uzerine yazilacak dosyanin yedeGini otomatik alir:

mv -b guncel_config.conf /etc/nginx/nginx.conf
# Eski nginx.conf dosyasi, nginx.conf~ olarak yedeklenir

-v (Verbose – Ayrintili Cikti)

Hangi dosyanin nereye gittigini gosterir. Buyuk toplu islemlerde cok ise yarar:

mv -v *.txt /home/mehmet/belgeler/

# Cikti:
# 'dosya1.txt' -> '/home/mehmet/belgeler/dosya1.txt'
# 'dosya2.txt' -> '/home/mehmet/belgeler/dosya2.txt'
# 'notlar.txt' -> '/home/mehmet/belgeler/notlar.txt'

-u (Update – Guncelle)

Sadece kaynak dosya, hedef dosyadan daha yeni ise tasir. Senkronizasyon benzeri senaryolarda ise yarar:

mv -u *.conf /etc/myapp/
# Sadece degismis config dosyalarini tasir

Gercek Dunya Senaryolari

Senaryo 1: Log Rotasyonu

Uygulama loglarini gunluk olarak arsivlemek cok yaygin bir ihtiyac. Asagidaki script bunu manuel olarak gosteriyor:

#!/bin/bash

# Log rotasyon scripti
LOG_DIR="/var/log/myapp"
ARSIV_DIR="/var/log/myapp/arsiv"
TARIH=$(date +%Y%m%d)

# Arsiv dizini yoksa olustur
mkdir -p "$ARSIV_DIR"

# Bugunun tarihiyle yeniden adlandir ve arsive tasI
mv -v "$LOG_DIR/app.log" "$ARSIV_DIR/app_${TARIH}.log"

# Uygulamanin log dosyasini yeniden olusturmasi icin sinyal gonder
systemctl reload myapp

echo "Log rotasyonu tamamlandi: app_${TARIH}.log"

Bu scripti crontab’a ekleyerek her gece calistirilabilir:

0 2 * * * /usr/local/bin/log_rotasyon.sh

Senaryo 2: Toplu Dosya Yeniden Adlandirma

Sunucuya yuklenen fotograflarin isimlerini standart bir formata getirmek gerekiyor diyelim. mv tek basina yeterli olmaz, bir dongu kurmak gerekir:

#!/bin/bash

# Tum .jpeg uzantili dosyalari .jpg'ye cevirme
DIZIN="/var/www/html/uploads"

for dosya in "$DIZIN"/*.jpeg; do
    if [ -f "$dosya" ]; then
        yeni_isim="${dosya%.jpeg}.jpg"
        mv -v "$dosya" "$yeni_isim"
    fi
done

echo "Yeniden adlandirma tamamlandi."

Ya da daha pratik bir yaklasim, rename komutu yoksa mv ile dizi kullanmak:

# Bosluk iceren dosya isimlerini alt tire ile degistirme
for f in * *; do
    mv "$f" "${f// /_}"
done

Bu son ornek ozellikle onemli. Bosluk iceren dosya isimleri script’lerde basa bela olur. Bunu standarize etmek iyi bir aliskanlik.

Senaryo 3: Yapilandirma Dosyasi Guncelleme

Bir uygulamanin konfigurasyonunu guncellerken geri donus imkani birakmak iyi pratik:

#!/bin/bash

CONFIG_DOSYASI="/etc/nginx/nginx.conf"
YENI_CONFIG="/tmp/nginx_yeni.conf"
TARIH=$(date +%Y%m%d_%H%M%S)

# Mevcut config'i yedekle
cp "$CONFIG_DOSYASI" "${CONFIG_DOSYASI}.${TARIH}.bak"

# Yeni config'i test et
nginx -t -c "$YENI_CONFIG"

if [ $? -eq 0 ]; then
    # Test basarili, yeni config'i yerlestiR
    mv -v "$YENI_CONFIG" "$CONFIG_DOSYASI"
    systemctl reload nginx
    echo "Nginx yapilandirmasi basariyla guncellendi."
else
    echo "HATA: Yeni yapilandirma gecersiz! Degisiklik yapilmadi."
    exit 1
fi

Bu yaklasim, nginx’i cokturmeden konfigurasyonu degistirmenin guvenli yolu.

Senaryo 4: Dagitim Sonrasi Temizlik

Uygulama dagitimlarinda (deployment) eski versiyonu arsive tasimak:

#!/bin/bash

APP_DIR="/var/www/myapp"
ARSIV_DIR="/var/www/arsiv"
VERSIYON=$(date +%Y%m%d_%H%M%S)

mkdir -p "$ARSIV_DIR"

# Eski versiyonu arsive tasI
if [ -d "$APP_DIR/current" ]; then
    mv -v "$APP_DIR/current" "$ARSIV_DIR/myapp_${VERSIYON}"
    echo "Eski versiyon arsivlendi: myapp_${VERSIYON}"
fi

# Yeni versiyonu aktive et
mv -v "$APP_DIR/new_release" "$APP_DIR/current"

echo "Dagitim tamamlandi."

Dikkat Edilmesi Gereken Durumlar

Dizin Tasirken Dikkat

Bir dizini baska bir dizine tasirken hedef dizinin var olup olmadigi sonucu degistirir:

# Hedef dizin (belgeler) YOKSA:
mv projeler/src belgeler
# Sonuc: src dizini, belgeler olarak yeniden adlandirilir

# Hedef dizin (belgeler) VARSA:
mv projeler/src belgeler
# Sonuc: src dizini, belgeler/src olarak tasInir

Bu davranis farki kafa karistirici olabilir. Ozellikle scriptlerde dizin varligini kontrol etmek gerekir.

Farkli Dosya Sistemleri Arasinda Tasima

Bunu daha once kisaca belirttik ama uzerinde durmak lazim. /home dizininden /mnt/nas gibi bir NFS mount’una buyuk bir dosya tasidiginizda:

  • mv komutu arka planda cp + rm yapar
  • Islem suresi dosya boyutuna baglidir
  • Islem ortasinda kesilirse, dosya her iki yerde de yarim kalabilir
  • Buyuk dosyalar icin rsync daha guvenli bir alternatif olabilir
# Buyuk dosya tasima icin daha guvenli alternatif
rsync --remove-source-files -avh /data/buyuk_dosya.tar.gz /mnt/nas/backup/

mv ve Sembolik Linkler

mv bir sembolik linki, linkin gosterdigi dosyayi degil, linkin kendisini tasiR. Bu bazen beklenmedik davranisa yol acabilir:

ls -la
# lrwxrwxrwx 1 root root 12 Jun  1 10:00 config.conf -> /etc/app/real.conf

mv config.conf /tmp/
# Linkin kendisi tasInir, /etc/app/real.conf'a dokunulmaz

Yaygin Hatalar ve Cozumleri

Hata 1: “cannot move – are on different file systems”

Bu hatayi genelde docker volume’leri veya bind mount’larla calisirken gorursunuz. Cozum: cp ile kopyala, sonra rm ile sil, ya da rsync kullan.

Hata 2: Yanlis dizin uzerine yazma

# YANLIS: belgeler dizininin icindeki herseyi silip
# yerine rapor.txt koyabilirsiniz
mv rapor.txt belgeler  # belgeler bir dosyaysa uzerine yazar!

# DOGRU: Hedefin dizin oldugunu dogrula
mv rapor.txt belgeler/
# Sondaki slash, belgeler'in dizin olmasi gerektigini belirtir

Hata 3: Root izni gerektiren dosyalar

# Hata: Permission denied
mv /etc/hosts /etc/hosts.bak

# Dogru: sudo ile calis
sudo mv /etc/hosts /etc/hosts.bak

Pratik Kisayollar ve Ipuclari

# Onceki konuma geri don (bash history ile)
# mv yaptiktan sonra eski yere donmek istersen
cd -

# Birdenbire cok sayida dosyayi organize etme
# Tum txt dosyalari txt_dosyalar klasorune
mkdir -p ~/duzenleme/txt_dosyalar
mv ~/masaustu/*.txt ~/duzenleme/txt_dosyalar/

# Bir dosyanin yedeGini alarak yeniden adlandirma
mv onemli.conf{,.bak}
# onemli.conf -> onemli.conf.bak

# Yukaridaki kisayolun acilimi:
mv onemli.conf onemli.conf.bak

O son brace expansion tricks’i cok ise yarar. Ayni ismi iki kez yazmaktan kurtariyor ve typo yapma riskini azaltiyor.

mv vs cp Karsilastirmasi

Ne zaman mv, ne zaman cp kullanimali?

  • mv kullan: Dosyayi bir yerden kaldirip baska yere koymak istiyorsan. Disk alanini bosaltmak istiyorsan.
  • cp kullan: Orijinali koruyarak yeni bir kopya olusturmak istiyorsan.
  • rsync kullan: Buyuk dosyalar veya farkli dosya sistemleri arasinda guvenli transfer istiyorsan, ilerleme takibi gerekiyorsa.

Sonuc

mv komutu ilk bakista basit gorunse de dogru kullanildiginda cok guclu bir arac. Gunluk sysadmin islerinde dosya organizasyonu, log yonetimi, deployment surecleri ve yapilandirma guncellemelerinde surekli karsimiza cikiyor.

Ozetlemek gerekirse en onemli noktalar:

  • Production ortaminda her zaman -i secenegi kullanin, kazayla uzerine yazmayin.
  • Farkli dosya sistemleri arasinda buyuk dosya tasirken dikkatli olun, gerekirse rsync tercih edin.
  • Scriptlerde dizin varligini kontrol edin, hedefin var olup olmadigi sonucu tamamen degistiriyor.
  • -b secenegi ile yedek alma aliskanligini edinin, ozellikle config dosyalariyla calısırken.
  • Toplu islemlerde -v kullanin, ne oldugunu takip edin.

mv komutunu bir kez dogru kullanmayi ogrenirsek, sonrasinda pek cok rutin gorevi scriptlerle otomatiklestirmek ve hata riskini minimize etmek cok kolaylasiyor. Umarim bu rehber ise yarar!

Yorum yapın