Ubuntu Türkiye

Yazılım => Programlama => Kabuk (sh,bash,*csh,ksh,zsh) => Konuyu başlatan: coderman - 07 Nisan 2019 - 19:36:15

Başlık: Bash ile Dosya Kopyalama (Yardım)
Gönderen: coderman - 07 Nisan 2019 - 19:36:15
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...
Başlık: Ynt: Bash ile Dosya Kopyalama (Yardım)
Gönderen: Empat - 08 Nisan 2019 - 16:57:53
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/
Başlık: Ynt: Bash ile Dosya Kopyalama (Yardım)
Gönderen: mimiksiz - 08 Nisan 2019 - 18:47:57
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.
Başlık: Ynt: Bash ile Dosya Kopyalama (Yardım)
Gönderen: coderman - 08 Nisan 2019 - 21:17:47
@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?
Başlık: Ynt: Bash ile Dosya Kopyalama (Yardım)
Gönderen: mimiksiz - 08 Nisan 2019 - 21:27:47
@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