Ubuntu Türkiye

Yazılım => Programlama => Kabuk (sh,bash,*csh,ksh,zsh) => Konuyu başlatan: mhmtkrktr - 28 Ocak 2018 - 13:51:43

Başlık: { text, *.zip, *.mp4, *.mkv, *.mp3 } Dosya Bölme İşlemi
Gönderen: mhmtkrktr - 28 Ocak 2018 - 13:51:43
Başlıkta uzantısı geçen dosyaları belirtilen sayıda bölme işlemi yapar. {text} metin içeren tüm dosyaları kapsar. Bunun dışında, şu an için belirtilenlerin dışında ki dosya türlerini tanımaz.

Kullanımı :
cd /betiğin/bulunduğu dizin
~/betik.sh -b=3 /dosyanın/bulunduğu_dizin/dosya.uzantı

## veya
/betiğin/bulunduğu dizin/betik.sh -b=3 /dosyanın/bulunduğu_dizin/dosya.uzantı


( -b=sayı ) Dosyanın kaç parçaya bölüneceğini belirtmek içindir. Bayt cinsinden boyut ile karıştırılmasın.
-b değeri en az 2, en çok 100 olarak verilebilir.
Artık dosya bu hesaba katılmadığı için, verilen sayıdan bir fazla (küçük boyutlu) dosya oluşturması normaldir.
*.zip dosyalarının içeriği bölünmediği için dosya sayısı tutarsızlık gösterebilir. Aynı dosya için 5 değeri verilir 7 'ye bölünür, 4 değeri verilir tam 4 'e bölünür gibi.
Ayrıca *.zip arşivlerinde bölme işlemi, arşivin içinde ki en büyük dosya baz alınarak hesaplandığı için bölüm sayısına her zaman istediğiniz sayıyı veremezsiniz. (betik uyarı verecek, olası en fazla sayıyı belirtecektir.)

Ana çalışma dizini home altında split dizinidir. Geçerli bir işlem yapıldığında, dosyanın tam konumu betik sonunda verilir.

#!/usr/bin/bash

  Fn="$(tput sgr0)"
  Bo="$(tput bold)"
  C1="${Bo}$(tput setaf 1)"
  C2="${Bo}$(tput setaf 3)"
  C3="${Bo}$(tput setaf 5)"
 
  sync

  cd ~
  [[ -d 'split' ]] || mkdir 'split'
  cd 'split'

unknown_content() {
  echo -e "\n ${C1}--HATA : ${C3}${1} ${C1}biçimi tanınmıyor !${Fn}"
  exit
}

command_content() {
  echo -e "\n ${C1}--HATA : ${1} ${C3} ${2} ${Fn}"
    [[ -n "$3" ]] && \
    echo -e "\n ${C3}-örn komut : ${C2}~/betik.sh -b=3 /dosya/dizini/dosya.uzantı ${Fn}"
  exit
}

split_dir() {
num=1
  while :; do
    if [[ ! -d "${Dir}-($num)" ]]; then
mkdir "${Dir}-($num)"
Dir="${Dir}-($num)"
break
    fi
  num=$((${num}+1))
  done
}

new_base_dir() {
    Dir=${1##*/}
    Dir=${Dir%.*}
    Dir=$(sed 's/ /-/g;s/\./-/g' <<<${Dir})
    Dnm=$Dir
if [[ -d "$Dir" ]]; then
    split_dir "$Dir"
else
    mkdir "$Dir"
fi

    cd "$Dir"
}

split_text() {
  new_base_dir "$2"
  split -b "${1}" -e "${2}"
}

count_text_size() {
FS=$(awk '{print $1}' <<<$(du -b "$1"))
  split_text $((${FS}/${SG})) "$1"
}

split_zip() {
  new_base_dir "$2"
  zipsplit -b "$(pwd)" -n "$1" "$2"
}

check_zip_byte() {
  MaX=$((${FS} / ${ByT}))
 
  if [[ $SG -gt $MaX ]]; then
echo -e "\n\n ${C2}-- UYARI : bu arşiv en fazla ${C3}$MaX ${C2}parçaya bölünebilir ! \n${Fn}"
exit
  else
split_zip $((${FS} / ${SG})) "$1"
  fi
}

count_zip_size() {
ByT=0
FS=$(unzip -l "$1"|awk '/files/{print $1}'|tail -1)

  while read line ; do
    ChK=$(awk '{print $1}' <<<"$line"|grep '^[0-9]')
if [[ "$ChK" -gt "$ByT" ]]
then
    ByT="$ChK"
fi
  done <<<$(unzip -l "$1"|grep -v "$FS")

check_zip_byte "$1"
}

split_audio() {
  new_base_dir "$1"
  ffmpeg -i "$1" -threads "$2" -codec copy -map 0 \
  -f hls -flags -global_header -hls_time "$3" \
  -hls_list_size 0 "${4}.m3u8"
}

split_video() {
  new_base_dir "$1"
  ffmpeg -i "$1" -threads "$2" -codec copy -map 0 -f hls \
  -vbsf h264_mp4toannexb -flags -global_header -hls_time "$3" \
  -hls_list_size 0 "${4}.m3u8"
}

count_vidau_time() {
CPU=$(grep -c '^processor' /proc/cpuinfo)
FLF=$(echo ${1##*/}|sed 's/;//')
  if grep -q 'mp4\|x-matroska\|mpeg' <<<$FLF; then
    DR=$(ffprobe -show_format "$2" -of compact 2>&1| \
    awk '/Duration/{print $2}')

if [[ -n $DR ]]; then
    TH=$(cut -d: -f1 <<<${DR%.*})
    TH=$((${TH}*60))

    TD=$(cut -d: -f2 <<<${DR%.*})
    TD=$((${TH}+${TD}))

    TSN=$(expr $(cut -d: -f3 <<<${DR%.*}) + 0)
    TSN=$(((${TH}+${TD}*60)+${TSN}))

    SGM=$((${TSN}/${SG}))

    [[ -z "$CPU" ]] && CPU=2

    [[ $3 == aud ]] && \
    split_audio "$2" "$CPU" "$SGM" "$Dir" || \
    split_video "$2" "$CPU" "$SGM" "$Dir"
fi
  else
unknown_content "${1%;*}"
  fi
}

file_species() {
  CL=$(file -N -i "$1" |tr ' ' '\n')
  ZP=$(grep '^application/zip;' <<<"${CL}")
  TX=$(grep '^text/' <<<"${CL}")
  AU=$(grep '^audio/' <<<"${CL}")
  VD=$(grep '^video/' <<<"${CL}")
  ER=$(grep -E '/*;$' <<<"${CL}")
}

  if [[ -z "$2" ]]; then
command_content 'komutu eksik yazdınız !' '.' 'help'
  fi
 
  if [[ $(grep '\-b=[0-9]' <<<"$1") ]]; then
SG=$(cut -d= -f2- <<<"$1"|tr -cd [:digit:])
[[ -n $SG && $SG -gt 1 && $SG -le 100 ]] || exit
  else
command_content 'parça sayısını girmediniz !' "==> örn: ${C2}-b=5 ${C3}gibi"
  fi

  if [[ -f "$2" ]]; then
file_species "$2"
[[ -n "$TX" || -n "$VD" || -n "$AU" || -n "$ZP" ]] || \
unknown_content "${ER%;*}"
[[ -n "$ZP" ]] && \
count_zip_size "$2"
[[ -n "$TX" ]] && \
count_text_size "$2"
[[ -n "$VD" ]] && \
count_vidau_time "$VD" "$2" vid
[[ -n "$AU" ]] && \
count_vidau_time "$AU" "$2" aud
  else
command_content 'dosya yolu hatalı !' "-> $2 <-"
  fi
 
  echo -e "\n\n ${C3}-- Çalışma dizini : ${C2}$(pwd)${Fn}\n"
Başlık: Ynt: { text, *.zip, *.mp4, *.mkv, *.mp3 } Dosya Bölme İşlemi
Gönderen: lnxdev - 28 Ocak 2018 - 14:01:00
[mention=636240]@mhmtkrktr[/mention], tüm sürat devam ediyorsun tebrik ederim tekrar güzel bir betikle karşımıza çıktın. Betik örnekleri içinde çok işe yarar olduğunu düşünüyorum eline sağlık.
Başlık: Ynt: { text, *.zip, *.mp4, *.mkv, *.mp3 } Dosya Bölme İşlemi
Gönderen: mhmtkrktr - 28 Ocak 2018 - 14:16:10
[mention=636243]@lnxdev[/mention] ; teşekkür ederim. Çok bir şey yapamadım aslında. Benim bilgisayarda sadece yukarda ki uzantıları bulup test edebildim. Bayaa fakirmiş benim bilgisayar.  :)

Her şey bi tarafa, baba mirasında 5110 'un traktöre yeğlenip kardeş kavgasına sebep olduğu zamanlarda olacaktı bu.  :D Müzik dosyalarını keser biçer telefona yüklerdik. Şimdi akıllısı çıktı dediler, o zevkimizi de aldılar elimizden.  ;D 
Başlık: Ynt: { text, *.zip, *.mp4, *.mkv, *.mp3 } Dosya Bölme İşlemi
Gönderen: lnxdev - 28 Ocak 2018 - 14:21:13
[mention=636244]@mhmtkrktr[/mention], doğru söylüyorsun  ;D
Başlık: Ynt: { text, *.zip, *.mp4, *.mkv, *.mp3 } Dosya Bölme İşlemi
Gönderen: oguz-ismail - 29 Ocak 2018 - 16:00:59
$(awk '{print $1}' <<<$(du -b "$1")) yerine;
$(stat -c '%s' "$1")

$(grep -c '^processor' /proc/cpuinfo) yerine;
$(nproc)

kullanabilirsiniz. güzel çalışma, teşekkürler
Başlık: Ynt: { text, *.zip, *.mp4, *.mkv, *.mp3 } Dosya Bölme İşlemi
Gönderen: 7hr33l3t73r - 17 Şubat 2018 - 16:23:42
@mhmtkrktr; Bolme isleminden sonra, toplama yapmiyor mu? :)
Başlık: Ynt: { text, *.zip, *.mp4, *.mkv, *.mp3 } Dosya Bölme İşlemi
Gönderen: mhmtkrktr - 17 Şubat 2018 - 20:48:50
Toplanmışı zaten elinde olmuyor mu?  :)
Amaç farklı parçaları seçerek birleştirmekse bu ilave edilebilir * tabi ki. Örneğin iki mp3 dosyasını tek bir dosyaya dönüştürme vb. İhtiyaç olacaksa neden olmasın.  ;)

Benim aklıma video dosyalarının seçilen parça aralığını gif resmine dönüştüren bir ilave gelmişti ama kafayı başka bir konuya verdiğim için şimdilik es geçmiştim bunu.

@oguz-ismail öneri için teşekkür ederim. Bunlar da olabilir istersen ama çalışma şekline bir artısı olmayacağı için değiştirmedim.
Başlık: Ynt: { text, *.zip, *.mp4, *.mkv, *.mp3 } Dosya Bölme İşlemi
Gönderen: 7hr33l3t73r - 17 Şubat 2018 - 21:02:13
Alıntı yapılan: mhmtkrktr - 17 Şubat 2018 - 20:48:50
Toplanmışı zaten elinde olmuyor mu?  :)
Amaç farklı parçaları seçerek birleştirmekse bu ilave edilebilir * tabi ki. Örneğin iki mp3 dosyasını tek bir dosyaya dönüştürme vb. İhtiyaç olacaksa neden olmasın.  ;)
Diyelim benim elimde yok. Dosyalari sizden parca parca  aldim ama elimde sizin betik var. Bir komut versem bana birlestirse tadindan yenmez. :)
Başlık: Ynt: { text, *.zip, *.mp4, *.mkv, *.mp3 } Dosya Bölme İşlemi
Gönderen: mhmtkrktr - 17 Şubat 2018 - 21:17:29
İnternetten partlı film indirip tek film haline getirmek gibi bir şey olsa gerek bu dediğin.  :D
Tamamdır, elimde birkaç çalışma var. Onları tamamlayıp geri döneyim buna. Hem bu arada biraz daha format çeşitliliği de ilave ederim.  ;)
Başlık: Ynt: { text, *.zip, *.mp4, *.mkv, *.mp3 } Dosya Bölme İşlemi
Gönderen: 7hr33l3t73r - 17 Şubat 2018 - 21:27:03
Bize de tesekkurlerimizi sunmak duser.