Bash ile Dosya Kopyalama (Yardım)

Başlatan coderman, 07 Nisan 2019 - 19:36:15

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

coderman

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...

Empat

Everything for me is just Peace - Love - Coding. Also, as they say: I am a programmer, I have no life!

mimiksiz

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.

coderman

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

mimiksiz

#4
@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