Dosyaları Boyuta ve Koşula Göre Filtreleyen Betik

Başlatan mimiksiz, 16 Haziran 2019 - 06:32:36

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

mimiksiz

Gücelleme: Performanslı çalışmadığı için yenisini yazdım:

#!/bin/zsh
çık(){
echo "-b ile aramak istediğiniz boyutu pozitif sayı olarak ve türünü (k m g) belirterek girmelisiniz. (m ve g türünde arama için ondalıklı sayı girilebilir) (1.2g)\n\n-t ile arama tipini büyük, küçük, eşit, büyük-eşit veya küçük-eşit  şeklinde belirtmelisiniz.\n\n-d ile aramak istediğiniz dizini belirtebilirsiniz. Varsayılan betiği çalıştırdığınız dizindir.\n\n-a ile alt dizinlerin de taranmasını isteyebilir,\n\n\"-b ve -t parametreleri betiğin çalışması için gereklidir.\"\n\n-y Bu yardım içeriğini gösterir."
exit
}
parametre_adet=$(echo $@|wc -w)
[ $parametre_adet -gt 7 -o $parametre_adet -lt 4 ] &>/dev/null && çık
bayrak=0
dizin=.
alt_dizinler=0
for indis in {1..$parametre_adet}
do
parametre="$(echo $@|awk '{print '"\$${indis}"'}')"
case $parametre in
-y)
çık
;;
-t)
bayrak=$((bayrak+1))
tür=$(echo $@|awk '{print '"\$${$((indis+1))}"'}')
;;
-b)
bayrak=$((bayrak+1))
boyut=$(echo $@|awk '{print '"\$${$((indis+1))}"'}')
;;
-d)
dizin=$(echo $@|awk '{print '"\$${$((indis+1))}"'}')
;;
-a)
alt_dizinler=1
;;
esac
done
[ $bayrak -ne 2 ] && çık
#-b kontrol
boyut_türü=${boyut[${#boyut}]}
echo $boyut_türü|grep "k\|m\|g" &>/dev/null || çık
boyut_miktarı=${boyut[0,${#boyut}-1]}
echo $boyut_miktarı|grep - &>/dev/null && çık
if [ $boyut_miktarı -eq 0 &>/dev/null ] || [[ $(echo boyut_miktarı|tr -d .) -eq 0 ]]
then
çık
elif echo $boyut_miktarı|grep \\. &>/dev/null
then
if [ "$boyut_türü" = "k" ] || [[ ! $boyut_miktarı =~ ^[0-9]+([.][0-9]+)$ ]]
then
çık
fi
fi
case $boyut_türü in
k)
boyut_miktarı=$boyut_miktarı\k
;;
m)
boyut_miktarı=$((boyut_miktarı*1024))
boyut_miktarı=$(echo $boyut_miktarı|cut -d. -f1)k
;;
g)
boyut_miktarı=$((boyut_miktarı*1024))
boyut_miktarı=$(echo $boyut_miktarı|cut -d. -f1)M
;;
esac
#-b kontrol tamamlandı
#-t kontrol
case $tür in
büyük)
boyut_miktarı=+$boyut_miktarı
;;
küçük)
boyut_miktarı=-$boyut_miktarı
;;
büyük-eşit)
boyut_miktarı=+$((${boyut_miktarı[0,${#boyut_miktarı}-1]}-1))
[ "$boyut_türü" != "g" ] && boyut_miktarı=$boyut_miktarı\k || boyut_miktarı=$boyut_miktarı\M
;;
küçük-eşit)
boyut_miktarı=-$((${boyut_miktarı[0,${#boyut_miktarı}-1]}+1))
[ "$boyut_türü" != "g" ] && boyut_miktarı=$boyut_miktarı\k || boyut_miktarı=$boyut_miktarı\
;;
esac
#-t kontrol tamamlandı
#-d kontrol
if [ -z $dizin ]
then
çık
elif [ ! -d $dizin ]
then
echo çık
fi
#-d kontrol tamamlandı
#arama
[ $alt_dizinler -eq 0 ] && alt_dizinler="-maxdepth 1" || alt_dizinler=""
find $dizin $(echo $alt_dizinler) -type f -size $(echo $boyut_miktarı) -exec ls -sh {} + |sort -n -r


Eski betik:
-b parametresiyle boyut ve boyut tipi (1.5gb) #kb,mb,gb girilebilir
-t parametresiyle koşul (büyük / küçük / eşit / büyük-eşit / küçük-eşit)
-d parametresiyle aranacak dizin (varsayılan ayar betiğin çalıştığı dizin)
-ç parametresiyle çıktı dosyası (var olan dosya girilemez, varsayılan ayar standart çıktı)
belirtilebilir.
-y ile yardım içeriğini görüntülenebilir.
-a eklenirse tüm alt dizinlerde taranır.
Çalışması için du ve zsh yazılımlarının olması lazım.
Hatalı parametre girişine karşı tedbirler aldım ve fonksiyon olarak kullanılabilir yazdım. Parametrelerin veriliş sırası önemli değil.
-b ve -t parametresi çalışması için gereklidir. Diğerleri opsiyoneldir.
Örnek kullanım:
./filtrele.sh -b 10gb -t büyük-eşit -a -d ~/ -ç ~/büyük-dosyalar.txt
#düzenleme parametre olarak birden fazla dizin verildimi kontrolü eklendi

#!/bin/zsh
parametreler=$(echo $@|awk '{print tolower($0)}')
parametreler2=$@
parametre_adet=$(echo $@|wc -w)
[ $parametre_adet -gt 9 ] && çık=1 || çık=0
! echo $@|grep \\-t &>/dev/null && çık=1 && ! echo $@|grep \\-b &>/dev/null && çık=1 || [ $parametre_adet -lt 2 ] && çık=1 || \
[ -z $parametreler ] && çık=2 || echo $parametreler|grep \\-y &>/dev/null && çık=2
while [ $çık -eq 0 ]
do
aranacak_dizin=$PWD
for (( a=1;a<=$parametre_adet;a++ ))
do
[ $(echo $parametreler|awk '{print '"\$${a}"'}') = \-b ] && \
aranan_konumu=$(( $a+1 )) && break
done
ham_aranan=$(echo $parametreler|awk '{print '"\$${aranan_konumu}"'}')
aranan_tipi=$(echo ${ham_aranan:$(( ${#ham_aranan}-2 ))})
[ $aranan_tipi != gb ] && [ $aranan_tipi != mb ] && \
[ $aranan_tipi != kb ] && çık=1 && break
aranan=${ham_aranan:0:$(( ${#ham_aranan}-2 ))}
aranan_ilk_karakter=${aranan:0:1}
nokta_adet=$(echo $aranan|tr -cd .|wc -m)
[ $aranan_ilk_karakter -eq $aranan_ilk_karakter &>/dev/null ] || çık=1
[ $çık -eq 1 ] && break
[ $(echo $aranan|awk -F "." '{print $1}') = $aranan &>/dev/null ] && \
[ $aranan_ilk_karakter -lt 1 ] && çık=1 && break
[ $nokta_adet -gt 1 ] && çık=1 && break
[ ! -z $(echo $aranan|tr -d .'[0-9]') ] && çık=1 && break
b_kontrol=0; a_kontrol=0; ç_kontrol=0; d_kontrol=0; t_kontrol=0; dizinmi_kontrol=0
for (( a=1;a<=$parametre_adet;a++ ))
do
_parametre=$(echo $parametreler2|awk '{print '"\$${a}"'}')
b=$(( $a+1 ))
_üst_parametre=$(echo $parametreler2|awk '{print '"\$${b}"'}')
[ $_parametre = \- ] && çık=1 && break
[ $_parametre = \-d ] && [ -z $_üst_parametre ] && çık=1 && break
[ $_parametre = \-d ] && [ ! -d $_üst_parametre ] && çık=1 && break
[ $_parametre = \-ç ] && [ -z $_üst_parametre ] && çık=1 && break
[ $_parametre = \-ç ] && [ -f $_üst_parametre ] && echo "$PWD dizininde $_üst_parametre dosyası mevcut.\nLütfen farklı çıktı konumu giriniz." && çık=2 && break
[ $_parametre != \-b ] && [ $_parametre != \-a ] && \
[ $_parametre != \-ç ] && [ $_parametre != \-d ] && \
[ -f $_parametre ] && [ ! -d $_parametre ] && \
[ $(echo $_parametre|awk -F b '{print $1}') = $_parametre &>/dev/null ] && \
[ $_parametre != \-t ] && \
çık=1 && break
if [ $_parametre = \-t ]
then
[ -z $_üst_parametre ] && çık=1 && break
[ $_üst_parametre != büyük ] && \
[ $_üst_parametre != küçük ] && \
[ $_üst_parametre != eşit ] && \
[ $_üst_parametre != büyük-eşit ] && \
[ $_üst_parametre != küçük-eşit ] && \
çık=1 && break || tip=$_üst_parametre
fi
if [ $_parametre = \-d ]
then
if [ ! -d $_üst_parametre ]
then
çık=1 && break
else
aranacak_dizin=$_üst_parametre
fi
fi
if [ $_parametre = \-ç ]
then
[ -d $(echo $parametreler|awk '{print '"\$${b}"'}') ] && çık=1 && break || \
__dosya=$(echo $parametreler|awk '{print '"\$${b}"'}') && touch $__dosya && çıkart=1 && break
fi
[ $_parametre = \-b ] && b_kontrol=$(( $b_kontrol+1 ))
[ $_parametre = \-a ] && a_kontrol=$(( $a_kontrol+1 ))
[ $_parametre = \-ç ] && ç_kontrol=$(( $ç_kontrol+1 ))
[ $_parametre = \-d ] && d_kontrol=$(( $d_kontrol+1 ))
[ $_parametre = \-t ] && t_kontrol=$(( $t-kontrol+1 ))
[ -d $_parametre ] && dizinmi_kontrol=$(( $dizinmi_kontrol+1 ))
done
[ $a_kontrol -gt 1 ] && çık=1 && break
[ $b_kontrol -gt 1 ] && çık=1 && break
[ $ç_kontrol -gt 1 ] && çık=1 && break
[ $d_kontrol -gt 1 ] && çık=1 && break
[ $t_kontrol -gt 1 ] && çık=1 && break
[ $dizinmi_kontrol -gt 1 ] && çık=1 && break
if [ $çık -eq 0 ]
then
case $aranan_tipi in
kb) çarp=1;;
mb) çarp=1024;;
gb) çarp=1048576;
esac
aranan=$(( $aranan*çarp ))
[ -z $(echo $aranan|tr -cd .) ] || aranan=$(echo $aranan|awk -F . '{print $1}')
break
fi
done
yardım="-b ile aramak istediğiniz boyutu pozitif tam sayı veya \
pozitif ondalıklı sayı olarak ve türünü belirterek girmelisiniz.\
(10.5gb)\n\n-t ile arama tipini büyük, küçük, eşit, büyük-eşit veya küçük-eşit \
şeklinde belirtmelisiniz.\n\n-d ile aramak istediğiniz dizini belirtebilirsiniz. \
Varsayılan betiği çalıştırdığınız dizindir.\n\n-a ile alt dizinlerin de \
taranmasını isteyebilir,\n\n-ç ile vereceğiniz konuma çıktıyı alabilirsiniz \
(Dosya varsa üzerine yazmaz, olmayan dosya adı girilmelidir).
\n\n\"-b ve -t parametreleri betiğin çalışması için gereklidir.\"\n\n \
-y Bu yardım içeriğini gösterir."
çıktıla(){
çıktı=$(echo -n $dosya_boyutu\\t && echo -n $PWD\/; \
echo $liste2|sed -n $a'p';echo $çıktı)
}
bulunduğu_dizinde(){
çıktı=""
liste0=$(find -maxdepth 1 -type f -exec du -a {} + | sort -n|awk -F "./" '{print $1,$2}')
liste1=$(echo $liste0|awk '{print $1}')
liste2=$(echo $liste0|awk '{for(i=2;i<=NF;i++){printf "%s ", $i}; printf "\n"}')
liste_adet=$(echo $liste0|wc -l)
for (( a=1;a<=$liste_adet;a++ ))
do
dosya_boyutu=$(echo $liste1|sed -n $a'p')
[ $tip = büyük ] && [ $dosya_boyutu -gt $aranan &>/dev/null ] && çıktıla
[ $tip = büyük-eşit ] && [ $dosya_boyutu -ge $aranan &>/dev/null ] && çıktıla
[ $tip = küçük ] && [ $dosya_boyutu -lt $aranan &>/dev/null ] && çıktıla
[ $tip = küçük-eşit ] && [ $dosya_boyutu -le $aranan &>/dev/null ] && çıktıla
[ $tip = eşit ] && [ $dosya_boyutu -eq $aranan ] && çıktıla
done
}
alt_dizinlerle(){
dizinler=$(find -type d)
dizin_adet=$(echo $dizinler|wc -l)
for (( _a=1;_a<=$dizin_adet;_a++ ))
do
dizin=$(echo $dizinler|sed -n $_a'p'|sed 's/^.\///g')
cd "$dizin" &>/dev/null
echo $aranacak_dizin\/$dizin\ dizini\ taranıyor.
bulunduğu_dizinde
çıktılar=$(echo $çıktı;echo $çıktılar|grep -v "^$")
cd - &>/dev/null
done
}
if [ $çık -eq 0 ]
then
cd $aranacak_dizin
çalıştırılan_dizin=$PWD
echo $parametreler|grep \\-a &>/dev/null && alt_dizinlerle || bulunduğu_dizinde
cd $çalıştırılan_dizin
if [ $çık -eq 0 ] && [ -z $çıktılar ]
then
[ $çıkart -eq 1 &>/dev/null ] && echo $çıktı>$__dosya || echo $çıktı
else
[ $çıkart -eq 1 &>/dev/null ] && echo $çıktılar>$__dosya || echo $çıktılar
fi
fi
[ $çık -eq 1 ] && echo "Hatalı Giriş Yaptınız.\n$yardım"
[ $çık -eq 2 ] && echo $yardım

Empat

[mention=647032]@mimiksiz[/mention]
Elinize sağlık.

Benim gibi yüzlerce GB arşive sahip olanlar için işe yarayacak bir betik.
Everything for me is just Peace - Love - Coding. Also, as they say: I am a programmer, I have no life!