Shell script ve argüman kullanarak girilen yoldaki tüm jpg dosyaların uzantısını jpeg olarak değiştirmek

0 oy
15 Kas, 2017 Genel kategorisinde misafir tarafından soruldu
13 Ara, 2017 ertan tarafından tekrar gösterildi
Shell script ve argüman kullanarak girilen yoldaki tüm jpg dosyaların uzantısını jpeg olarak değiştirmek şu şekilde çalışmalı ./deneme.sh /home/burak/deneme jpg jpeg teşekkürler

1 cevap

0 oy
16 Kas, 2017 ertan (16,390 puan) tarafından cevaplandı
 
En İyi Cevap

 

#!/bin/bash
# ilk kontrol: parametre sayisi 3 ten az ise butun parametreler girilmemis demektir
[ $# -lt 3 ] && echo "butun parametreler girilmedi" && exit
# ikinci kontrol: ilk parametre olan yolun dosya sisteminde olup olmadiginin kontrolu
[ ! -e "$1" ] && echo "Gecersiz yol verildi" && exit  
# sonra komuta verilen parametreleri degiskenlere atiyoruz
# sadece 1 kez kullanilacaklari icin gerek yok aslinda, 
# direk olarak kullanilabilirdi $1 $2 diye ama kodun anlasilmasini kolaylastirir
yol="$1"
kaynakUzanti="$2"
hedefUzanti="$3"
# sonra calisma dizinimizi yol parametresi olarak belirliyoruz,
# cd "$yol" ile ayni islem. bu kullanima da ornek olsun diye koydum.
# ekrana klasor ismini yazdirmasin diye ciktisini /dev/null a yonlendiriyoruz.
pushd "$yol" > /dev/null 
# bir dongu ile her bir degisecek dosyayi dosya degiskenine aliyoruz
for dosya in *.${kaynakUzanti}; do  
    # her biri icin rename islemi
    mv "$dosya" "$(basename "$dosya" .${kaynakUzanti}).${hedefUzanti}"
done
#calisma dizinine gecmeden onceki dizinimize donuyoruz
popd > /dev/null 

Ayrıca bkz: linux birden fazla dosya uzantısını değiştirme

16 Kas, 2017 misafir tarafından yorumlandı
  1. #!/bin/bash

    # ilk kontrol: parametre sayisi 3 ten az ise butun parametreler girilmemis demektir

    [ $# -lt 3 ] && echo "butun parametreler girilmedi" && exit

    # ikinci kontrol: ilk parametre olan yolun dosya sisteminde olup olmadiginin kontrolu

    [ ! -e "$1" ] && echo "Gecersiz yol verildi" && exit  

    # sonra komuta verilen parametreleri degiskenlere atiyoruz

    # sadece 1 kez kullanilacaklari icin gerek yok aslinda, 

    # direk olarak kullanilabilirdi $1 $2 diye ama kodun anlasilmasini kolaylastirir

    yol="$1"

    kaynakUzanti="$2"

    hedefUzanti="$3"

    # sonra calisma dizinimizi yol parametresi olarak belirliyoruz,

    # cd "$yol" ile ayni islem. bu kullanima da ornek olsun diye koydum.

    # ekrana klasor ismini yazdirmasin diye ciktisini /dev/null a yonlendiriyoruz.

    pushd "$yol" > /dev/null 

    # bir dongu ile her bir degisecek dosyayi dosya degiskenine aliyoruz

    for dosya in *.${jpg}; do  

    # her biri icin rename islemi

        mv "$dosya" "$(basename "$dosya" .${jpg}).${jpeg}"

    done

    #calisma dizinine gecmeden onceki dizinimize donuyoruz

    popd > /dev/null 

şekline yaptım fakat jpg dosyaları .jpg şekline dönüşüyor nerde hata yapıyor olabilirim ?

16 Kas, 2017 ertan (16,390 puan) tarafından yorumlandı
for dosya in *.${jpg}; do  
# her biri icin rename islemi
    mv "$dosya" "$(basename "$dosya" .${jpg}).${jpeg}"
done

Bu değişikliği yapmana gerek yok. Verdiğim kodu deneme.sh olarak kaydedip senin verdiğin örnekteki gibi çalıştır:
 

./deneme.sh /home/burak/deneme jpg jpeg 

hangi uzantilarin neye dönüşeceğini zaten parametre olarak veriyoruz. kodun içine gömmene (hardcode) gerek yok. Script o parametreleri alıp o değiştirme işleminde kullanıyor zaten. Yaptığın hata da jpg ve jpeg i değişkenmiş gibi kullanman. $jpg veya ${jpg} diye değişken yok, o yüzden boş olur mv komutunun o kısmı. Örnek olarak hazırladığım script verdiğin parametrelere göre değiştirme yapacak şekilde hazır. ör.  ./deneme.sh /home/burak/deneme txt text (txt uzantılı dosyaları text uzantısı olacak şekilde değiştirir).

16 Kas, 2017 misafir tarafından yorumlandı
16 Kas, 2017 düzenlendi
hocam şuan oldu gerçekten çok teşekkür ediyorum :) öncelikle nasıl yaptınız biraz bahsedebilir misiniz ve popd ve pushd komutlarını ilk kez görüyorum onlar tam olarak ne işe yarıyor ? biraz daha basitleştirilirse yerlerine ne koyabilirim
16 Kas, 2017 ertan (16,390 puan) tarafından yorumlandı

açıklamalar kodun içerisinde # ile başlayan satırlarda yorum olarak zaten var. onları sana açıklama olsun diye ekledim, # ile başlayan satırları script den silebilirsin, çalışmasına etkisi yok ama daha ileri tarihte açıp baktığında neyin ne olduğunu hatırlamana yardımcı olabilir. pushd kullanarak ilk parametre olarak verdiğimiz yola gitmesini söylüyoruz, dosya uzantı değiştirme işlemini o klasör içerisinde yapacak çünkü.

Şu sitede 12. madde olarak biraz değiniyor:
http://www.smokinsizpenguen.com/linuxta-14-pratik-ornekle-cd-komutu/

16 Kas, 2017 misafir tarafından yorumlandı
ve çok harika ve hızlısınız çok minnettar kaldım :)
16 Kas, 2017 misafir tarafından yorumlandı
son sorum [ ! -e "$1" ] komutu tam olarak nasıl çalışıyor ve ne işe yarıyor ? açıklayabilir misiniz ? -e ne anlama geliyor ve neden $1 kullandınız ? birde bunu if test ile yazabilir misiniz bu kullanıma pek hakim değilim de
16 Kas, 2017 ertan (16,390 puan) tarafından yorumlandı
if (eğer) şart kontrolünün kısa yazılışı diyebiliriz.

if [ doğru ise ]
then # o zaman
# bunlari yap
else # degilse
# sunlari yap
fi # if kontrolünün bitişini fi ile yapıyoruz.

yani bizim kullanımımızın aslında uzun yazılışı
eğer [ verilen yol dosya sisteminde yok ise ]
o zaman
hata mesajini ekrana yazdir
programdan çık
eğer sonu

yani şu şekilde yazabilirdik:
if [ ! -e "$1" ]
then
echo "gecersiz yol"
exit
fi

bizim kullanımı parçalarına bölersek:
! = not = değil (ise), bir logical/mantıksal operatör. bir boolean (doğru/yanlış) ı tersine çevirmede kullanıyoruz. !doğru=yanlış oluyor. !yanlış=doğru oluyor :)
-e = mevcut ise = arkasından gelen yol parametresinin dosya sisteminde olup olmadığının kontrolü.
"$1" = script'in ilk/birinci parametresi. bu bizim kullanımımızda yol/klasör/dizin.
-e "$1" = script'e verilen ilk parametre dosya sisteminde var ise
ama bize tersi lazım, yani dosya sisteminde verilen klasör yok ise zaten arkasından gelen hiçbir işleme devam etmenin mantığı yok.
o yüzden eğer kontrolünde başa ! koyuyoruz ve [ eğer dosya sisteminde bu klasör yok ise ] anlamına geliyor.
&& = logical/mantıksal VE/AND operatörü. bizim kullanımızda "eğer sol taraf doğru ise sağ tarafı çalıştır" anlamında bir kısayol.
yani if [ ...] then <- burdaki then gibi düşünülebilir. eğer klasör dosya sisteminde yok ise if şartı DOĞRU/TRUE dönecek ve AND/&& sağ tarafına gelen komut[lar] çalışacak, onlar da ekrana hata mesajı yazdırma ve programdan çıkma.
16 Kas, 2017 misafir tarafından yorumlandı
çok sağolun hocam herşey için çok teşekkür ederim
Hoş geldiniz, sorsana.co sizlere sorularınızın diğer kullanıcılarımız tarafından cevaplanması için bir ortam sağlar.
...