[Çözüldü] Dosyanın İsmini Değiştirmek

Başlatan bilge, 14 Temmuz 2009 - 17:58:28

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

bilge

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.
   

bytan

İ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
Umut en büyük kötülüktür; işkenceyi uzatır. - F.N.


Bir şey ne ise odur, bu kadar. Öyleyse, iki şey arasında bağdaşıklık varsa, bu aralarında iletişim kuruyorlar demek değildir.
"... kavrayışını bilgi ile derinleştir ..."
PF @ ST

bilge

#2
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

bytan

Ö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.
Umut en büyük kötülüktür; işkenceyi uzatır. - F.N.


Bir şey ne ise odur, bu kadar. Öyleyse, iki şey arasında bağdaşıklık varsa, bu aralarında iletişim kuruyorlar demek değildir.
"... kavrayışını bilgi ile derinleştir ..."
PF @ ST

bilge

Ben de o şekilde yapmak istiyorum.Terminale  betik.sh dosya_biçimi dosya1 dosya2 .....  şeklinde yazim,o yazdığım dosyaları değiştirsin.

bytan

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
Umut en büyük kötülüktür; işkenceyi uzatır. - F.N.


Bir şey ne ise odur, bu kadar. Öyleyse, iki şey arasında bağdaşıklık varsa, bu aralarında iletişim kuruyorlar demek değildir.
"... kavrayışını bilgi ile derinleştir ..."
PF @ ST

bilge

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ı?

bytan

Shift ile sağdaki parametrenin değeri soldaki parametreye aktarılabilir. Sağdakinin değeri ise, kendisinin sağındaki parametrenin değeri olur.

Umut en büyük kötülüktür; işkenceyi uzatır. - F.N.


Bir şey ne ise odur, bu kadar. Öyleyse, iki şey arasında bağdaşıklık varsa, bu aralarında iletişim kuruyorlar demek değildir.
"... kavrayışını bilgi ile derinleştir ..."
PF @ ST

bilge

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.

bytan

Uzantıyı başa alınca, shift ile daha güzel olmuş.

Madem etiketledin, kapatalım. :)
Umut en büyük kötülüktür; işkenceyi uzatır. - F.N.


Bir şey ne ise odur, bu kadar. Öyleyse, iki şey arasında bağdaşıklık varsa, bu aralarında iletişim kuruyorlar demek değildir.
"... kavrayışını bilgi ile derinleştir ..."
PF @ ST