Merhaba arkadaşlar,
Bir betik yazdım fakat çalıştırdığımda bir sonuç alamadım.Problemim şu; konsola betik_adı dosya1 dosya2 şeklinde yazıcam.o klasörde bulunan dosya1 dosya2 nin sonuna belirtilen bir ekleme yapılacak.Örneğin ben dosyaların sonuna .txt eklenmesini istedim,bana onları ekleyip vericek.Betiğim şu şekilde;
echo "$# parametre var"
echo "Dosya isimleri: $1 $2"
echo "İstenilen uzantı: $3"
echo "Yeni dosya isimleri:"
`rename "s/$1 $2/\ $1 $2.$3/"`
exit
Zannedersem "rename" satırında hata var.Ama neden kaynaklandığını çözemedim.Yardımlarınızı bekliyorum.
İstediğin farklı yöntemlerle yapılabilir. Aşağıdakini dene bakalım işine yarayacak mı?
#!/bin/bash
echo "$# parametre var"
echo "Dosya isimleri: $1 $2"
echo "İstenilen uzantı: $3"
echo "Yeni dosya isimleri:"
mv $1 $1.$3
mv $2 $2.$3
echo $1.$3 $2.$3
exit 0
Aslında tam olarak yapmaya çalıştığım öyle değil.Yani ben bir çok dosyada değişiklik yapabilirim.İlk başta 2 sonra 3.Yani dosya sayıları belli olmadığı için mv $1 $1.$3 şeklindeki bir kullanımda doğru olmaz diye düşünüyorum.Bunu for döngüsüyle yapmam gerekicek,
Yani şu şekilde herhalde:
echo "$# parametre girdiniz."
echo "Eklemek istediginiz formatı giriniz: $1" //Kaç tane dosyanın ekleniceğini bilmediğim için eklenmek isteneni ilk sıraya koydum.İlk parametrede o olduğu için diğer parametreler 2'den başlıyacak.
i=$#-1
i=2
for i in ($#)-1 //zannedersem burada yazımda bir yanlışlık var.Girilen parametre sayısından biri uzantı olduğundan diğerleri de dosyalardır.
mv ($i $i+1 şi+2.....).$1 şeklinde bir şey olamaz mı?
Umarım anlatabilmişimdir.Yardımlarınızı bekliyorum.
Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 15 Temmuz 2009 - 12:06:28
Arkadaşlar böyle bir şey yaptım değişik olarak,ama yine hata alıyorum :(..
echo "İstenilen uzantı: $1"
i=2
for i in `expr $# - 1` ;
do
mv $i $i.$1
i=`expr ${i} + 1`
done
exit
Öncelikle parametreleri bir dizi (array) içine kaydettim. Aşağıdaki gibi dene, ufak tefek kısımlarını kendine göre değiştirirsin:
#!/bin/bash
N=$#
a=1;
for p in "$@";
do
dizi[$a]="$p";
a=$(($a+1));
done
echo "dosya isimleri...."
for i in $(seq 1 1 $(($N-1)))
do
echo ${dizi[$i]};
done
echo "istenilen uzanti:";
echo ${dizi[$N]}
echo "Yeni Dosya isimleri:";
for i in $(seq 1 1 $(($N-1)))
do
mv ${dizi[$i]} ${dizi[$i]}.${dizi[$N]};
echo ${dizi[$i]}.${dizi[$N]};
done
exit 0
Aslında bu işlemleri daha basit yapmanın da yolları var. Örneğin betiğini:
betik.sh -d dosya1 dosya2 -e istenilen_uzanti
şeklinde çalışması için ayarlarsan, hem görünüşü güzel olur hem de istenilen uzantının mecburi olarak son parametre olarak girilmek gibi bir durumu olmaz.
Ben de o şekilde yapmak istiyorum.Terminale betik.sh dosya_biçimi dosya1 dosya2 ..... şeklinde yazim,o yazdığım dosyaları değiştirsin.
Bash programalama işini en başından alarak başlarsan, senin için daha iyi olur. Gerçi insan önüne bir hedef koymadan da olmuyor. :) Neyse ki her taraf geniş kaynaklarla dolu. "Bash +parameters" aramasıyla çok sonuç elde edebilirsin. Örnek olarak işine yarayacağını düşündüğüm bir link:
http://www.ibm.com/developerworks/linux/library/l-bash-parameters.html#N100D2
Yok o zaten hedefimdi.O yüzden bu örneklerle uğraşıyorum.Kendimi betik yazmakta geliştirmek için.Ben de Bash Beginners Guide ile çalışıyorum.Önerin için teşekkür ederim.O kaynağa da bir bakim.
Bir de Beginners Guide'de bunun için shift komutunu önermişler.Bunun hakkında bilginiz var mı?
Shift ile sağdaki parametrenin değeri soldaki parametreye aktarılabilir. Sağdakinin değeri ise, kendisinin sağındaki parametrenin değeri olur.
Evet shift ile hallettim sonunda =)..
Betiğin son hali şöyle;
a="txt"
a=$1
shift
while (("$#")); do
mv ${1} ${1}.${a}
shift
done
Yardımlarınız için teşekkür ederim.Sizi de baya uğraştırdım.
Uzantıyı başa alınca, shift ile daha güzel olmuş.
Madem etiketledin, kapatalım. :)