Merhaba
Bash kullanarak bir script yazmam gerekiyor. Joker elamanlı argüman olarak aldığı veriye uygun dosyaları yeni isimle kopyalaması gerekiyor.
script.sh -R *.txt "yenisim"
Yukarıda ki komut (-R argümanı zorunlu değil) uzantısı .txt olan bütün dosyaları yeniisim1.txt yeniisim2.txt diyerek kopyalaması gerekiyor. Eğer -R argümanı varsa alt klasöründe ki dosyalara da yapması gerekiyor bu işlemi. Ama ben yapamadım :(
Kod: https://paste.ubuntu.com/p/TD8FGBQHvX/
#!/bin/bash
if [ -n "$1" ]
newname=${@: -1}
then
numb=1
unset "${#array[@]}-1"
for arg in "$@"
do
echo $arg
filename=$(basename -- "$arg")
extension="${filename##*.}"
oldfilename="${filename%.*}"
yeniisim="$newname$numb.$extension"
cp -r "$arg" "$yeniisim"
numb=$[ numb + 1 ]
done
else
echo "Lütfen Argüman Giriniz!"
echo "./sh -R *.txt"
echo "./sh *.txt"
fi
Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 07 Nisan 2019 - 21:57:22
Son Hali:
Alıntı Yap#!/bin/bash
if [ -n "$1" ]
newname=${@: -1}
then
numb=1
for last; do true; done
set -- "${@:1:$(($#-1))}"
for arg in $@
do
echo $arg
filename=$(basename -- "$arg")
extension="${filename##*.}"
oldfilename="${filename%.*}"
yeniisim="$newname$numb.$extension"
numb=$[ numb + 1 ]
echo $yeniisim
done
else
echo "Lütfen Argüman Giriniz!"
echo "./sh -R *.txt"
echo "./sh *.txt"
fi
İsimlendirme doğru, ama -R seçneği ile alt klasörlere nasıl işleteceğim onu bilemedim...
Bu konuda [mention=639565]@mimiksiz[/mention]'in bilgisi olabilir.
Bir keresinde bana Bash'ta bir script yazarken yardım etmişti.
Fakat forumda pek aktif değil. Denk gelirse cevap verir muhtemelen.
Aşağıdaki kaynaklarda sorunuzun yanıtı, hatta daha fazlası var muhtemelen.
http://www.tldp.org/LDP/Bash-Beginners-Guide/Bash-Beginners-Guide.pdf
http://www.tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html
http://web.deu.edu.tr/doc/lis/lis-3.html
https://www.ozban.com/shell-programlama
http://www.muratyazici.com/wp-content/dersler/acikkaynak/8-KabukProgramlama.pdf
https://www.dijitalders.com/icerik/22/2546/shell_bashsh_zsh_programming_kabuk_programlama.html
https://linux.web.tr/linux-dersleri/1/unix-linux-shell-kernel
https://seminer.linux.org.tr/wp-content/uploads/kabukprogramlama.pdf
http://yunus.hacettepe.edu.tr/~yurdugul/3/indir/KabukProgramlama.pdf
https://pdfs.semanticscholar.org/presentation/4e38/701d9b356397bd5e4f20a9abebe5e3f84115.pdf
http://www.penguen.net/wp-content/uploads/2011/08/KabukProgramlama.pdf
https://sudo.ubuntu-tr.net/Bash-1
http://cayfer.bilkent.edu.tr/~cayfer/kku/141-189.pdf
https://gist.github.com/roktas/8051467
http://kisi.deu.edu.tr//asli.ergun/acikkaynakisletimsistemleri3.pdf
http://docplayer.biz.tr/25860102-Shell-bash-sh-zsh-programming-kabuk-programlama.html
http://file.allitebooks.com/20160309/Linux%20Command%20Line%20and%20Shell%20Scripting%20Bible,%203rd%20Edition.pdf
http://www.allitebooks.com/
Dosya adlarında boşluk karakteri olmamalı.
#!/bin/bash
if [ -n "$3" ] && [ "$1" = "-R" ] #-R parametresi varken
then
numb=1
files=$(find -name "*.txt" 2>/dev/null)
files_count=$(echo $files|wc -w)
for (( a=1;a<=$files_count;a++ ))
do
newname=${@: -1}
file_full_path=$(echo $files|awk '{print '"\$${a}"'}')
file=$(echo $file_full_path|awk -F "/" '{print $NF}')
directory_path=$(echo $file_full_path|awk -F "$file" '{print $1}')
cd $directory_path #dosyanın bulunduğu dizine geçiliyor
filename=$(basename -- "$file")
extension="${filename##*.}"
oldfilename="${filename%.*}"
yeniisim="$newname$numb.$extension"
cp -r "$file" "$yeniisim"
echo $file $yeniisim
numb=$[ numb + 1 ]
cd - &>/dev/null #dosya kopyalandıktan sonra eski dizine geçiliyor
done
elif [ -n $2 ]
then
numb=1
newname=${@: -1}
count=$(echo ${#@})
count=$(( $count-1 ))
array=$(echo ${@:1:$count})
array_count=$(echo -n $array|wc -w)
for (( a=1;a<=$array_count;a++ ))
do
arg=$(echo $array | awk '{print '"\$${a}"'}')
filename=$(basename -- "$arg")
extension="${filename##*.}"
oldfilename="${filename%.*}"
yeniisim="$newname$numb.$extension"
cp -r "$arg" "$yeniisim"
numb=$[ numb + 1 ]
done
else
echo "Lütfen Argüman Giriniz!"
echo "./sh -R *.txt"
echo "./sh *.txt"
fi
umarım işe yarar.
@Empat çok teşekkür ediyorum yönlendirmeleriniz ve destekleriniz için, tek tek inceleyeceğim :)
@mimiksiz tövbe bismillah hocam bu ne? Ellerinize emeklerinize sağlık cidden yazdım programa boyut atlatmışsınız. Yüksek müsaadeniz ile bunu ödev olarak vereceğim, ancak takıldığım bir kaç durum var. Çözemezsem destek isteyebilir miyim?
@coderman güle güle kullanın :) Yapabileceğim bir şey olursa yapmaya çalışırım.
Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 08 Nisan 2019 - 21:36:37
ama array olarak değişken tanımlamışım o dizi değil string arg=$(echo $array | awk '{print '"\$${a}"'}')
satırında ise dizginin a nıncı kelimesini alıyor.
Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 08 Nisan 2019 - 21:44:49
Ayrıca boş değer girince else durumuna düşmüyormuş. Düzelttim
#!/bin/bash
if [ "$3" != "" ] && [ "$1" = "-R" ]
then
numb=1
files=$(find -name "*.txt" 2>/dev/null)
files_count=$(echo $files|wc -w)
for (( a=1;a<=$files_count;a++ ))
do
newname=${@: -1}
file_full_path=$(echo $files|awk '{print '"\$${a}"'}')
file=$(echo $file_full_path|awk -F "/" '{print $NF}')
directory_path=$(echo $file_full_path|awk -F "$file" '{print $1}')
cd $directory_path
filename=$(basename -- "$file")
extension="${filename##*.}"
oldfilename="${filename%.*}"
yeniisim="$newname$numb.$extension"
cp -r "$file" "$yeniisim"
numb=$[ numb + 1 ]
cd - &>/dev/null #dosya kopyalandıktan sonra eski dizine geçiliyor
done
elif [ "$2" != "" ]
then
numb=1
newname=${@: -1}
count=$(echo ${#@})
count=$(( $count-1 ))
_string=$(echo ${@:1:$count})
_string_count=$(echo -n $_string|wc -w)
for (( a=1;a<=$_string_count;a++ ))
do
arg=$(echo $_string | awk '{print '"\$${a}"'}')
filename=$(basename -- "$arg")
extension="${filename##*.}"
oldfilename="${filename%.*}"
yeniisim="$newname$numb.$extension"
cp -r "$arg" "$yeniisim"
numb=$[ numb + 1 ]
done
else
echo "Lütfen Argüman Giriniz!"
echo "./sh -R *.txt"
echo "./sh *.txt"
fi