#!/bin/bash
# Extract subtitles from each MKV file in the given directory
# If no directory is given, work in local dir
if [ "$1" = "" ]; then
  DIR="."
else
  DIR="$1"
fi
# Get all the MKV files in this dir and its subdirs
find "$DIR" -type f -name '*.mkv' | while read filename
do
  # Find out which tracks contain the subtitles
  mkvmerge -i "$filename" | grep 'subtitles' | while read subline
  do
    # Grep the number of the subtitle track
    tracknumber=`echo $subline | egrep -o "[0-9]{1,2}" | head -1`
    # Do a super-primitive language guess: ENGLISH
    # Corrected
    tracklanguage=`mkvmerge -F verbose-text -i "$filename" | sed -n -e '/^Track ID '"$tracknumber"':/s/.* language:\([a-z]\{3\}\) .*/\1/p'`
    [ "$tracklanguage" ] || tracklanguage="unknown"
    # Get base name for subtitle
    subtitlename=${filename%.*}
    # Extract the track to a .tmp file
    mkvextract tracks "$filename" $tracknumber:"$subtitlename.srt.tmp" > /dev/null 2>&1
    chmod g+rw "$subtitlename.srt.tmp"
    # Rename to the final name
    mv "$subtitlename.srt.tmp" "$subtitlename-t$tracknumber-$tracklanguage.srt" > /dev/null 2>&1
  done
done
nem egyedül csináltam, egy deszkamodell már létezik v.hol a neten :)
- apostroph3 blogja
 - A hozzászóláshoz be kell jelentkezni
 - 1213 megtekintés
 
Hozzászólások
if [ "$1" = "" ]
  then DIR="."
  else DIR="$1"
fi
Egyebkent azt, hogy a string nem ures-e, az a [ "$1" = "" ] helyett lehet igy is: [ -n "$1" ] vagy a szmomra jobban olvashato formaban: [ ! "$1" ] aminek a negalasabol es az if megforditasabol ki is jon, hogy:
if [ "$1" ]
  then DIR="$1"
  else DIR="."
fi
De valojaban bashban (!szoval csak ha biztos, hogy bash!) default erteket igy erdemes:
DIR=${1:-.}
man bash:
${parameter:-word} Use Default Values. If parameter is unset or null, the expansion of word is substituted. Otherwise, the value of parameter is substituted.
- A hozzászóláshoz be kell jelentkezni
 
Emiatt a comment miatt sub, thx :)
- A hozzászóláshoz be kell jelentkezni
 
Apró javítás: vagy -z a -n helyett, vagy != az = helyett. De a lényeg valóban az, amit a végén írtál.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE- A hozzászóláshoz be kell jelentkezni
 
+1
[ -z "$X" ] -> igaz ha X ures (vagyis nincs erteke vagy az erteke ures string)
[ -n "$X" ] -> igaz ha X NEM ures
[ ! "$X" ]  -> igaz ha X ures
[ "$X" ]    -> igaz ha X NEM ures
- A hozzászóláshoz be kell jelentkezni
 
mondjuk így is működik, és jól, valamint sem jobb, sem gyorsabb nem lenne a változtatással.
ha változtatnék, és miért ne? akkor valami ilyesmit csinálnék:
if [ "$1" = "-h" ]; then
  usage
  exit 0
elif [ "$2" ]; then
  usage
  exit 1
# If no directory is given, work in local dir
elif [ ! "$1" ]; then
  DIR="."
elif [ -e "$1" ]; then
  DIR="$1"
else
  usage
  echo
  echo "  ERROR: $1 ..."
  exit 1
fi
valamint:
  mkvmerge -i "$filename" | sed -n -e 's/^Track ID \([0-9]\+\): subtitles .*$/\1/p' | while read tracknumber
  do
    tracklanguage=`mkvmerge -F verbose-text -i "$filename" | sed -n -e '/^Track ID '"$tracknumber"':/s/.* language:\([a-z]\{3\}\) .*/\1/p'`
    [ "$tracklanguage" ] || tracklanguage="unknown"
    subtitlename=${filename%.*}
    mkvextract tracks "$filename" $tracknumber:"$subtitlename.srt.tmp" > /dev/null 2>&1
    chmod g+rw "$subtitlename.srt.tmp"
    mv "$subtitlename.srt.tmp" "$subtitlename-t$tracknumber-$tracklanguage.srt" > /dev/null 2>&1
  done
ezzel viszont gyorsabb lenne..
nem mintha ez számítana:)
a végén a .tmp fájlba mentést, meg az átnevezését azt meghagynám, csak kilépnék ha sikertelen az átnevezés.
de gyorsan kellett és jól műkodik :))
- A hozzászóláshoz be kell jelentkezni
 
Miért -e? Miért nem -d?
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE- A hozzászóláshoz be kell jelentkezni
 
mert ma reggel kellett, azóta nem nagyon volt rá időm, este meg kedvem nem nagyon volt..
:)
de most, hogy lenyugodtak a do'gok és erről beszélünk, plusz lesz valami erős javítás, akkor átírom, mint ahogy mindenki magának, ha egyáltalán :)
egyébként meg én is innen másoltam ki az otthoni gépemre :))
- A hozzászóláshoz be kell jelentkezni
 
Mondjuk még asszem az életben nem láttam, de tudtommal mkv-ban nem csak srt feliratfájl lehet (hanem pl. subrip is - de mondjuk amikor ilyet csináltam, azt nem ette meg a TV-m)
=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?
- A hozzászóláshoz be kell jelentkezni
 
"mondjuk így is működik, és jól, valamint sem jobb, sem gyorsabb nem lenne a változtatással."
Jajj, hat veled ne kelljen soha egyutt dolgoznom. Latom mar, te vagy az a szigszalagos srac. ;)
Na, de mindegy, engem ennyivel nem alitasz meg. Folytassuk az argumentumkezelessel. ;)
Mondjuk en elegge utalom az elif-et, hacsak lehet kerulom, szerintem atlathatatlanna teszi a kodot. Arumentumokat egy while ciklusban case-zel szepen lehet kezelni es akkor a kapcsolok sorrenje se szamit (a te kododban pl a -h csak az elso helyen lehet):
DIR=""
while [ "$1" ]; do
  case "$1" in
    "-h"|"--help")
          usage
          exit 0
    "*")
          if [ "$DIR" ]; then
            usage
            exit 1
          else
            DIR=$1
          fi
  esac
  shift
done
DIR=${1:-.}
- A hozzászóláshoz be kell jelentkezni
 
#!/bin/bash
# Extract subtitles from each MKV file in the given directory
usage()
{ 
  echo "$(basename $0 .sh) [options] [<filename1|dirname1>]"
}
sublist() {
:
}
subext() {
  local tracknumber
  local tracklanguage
  local subtitlename
  local subtypename
  local tracktype
  local extension
  local DIR=$1
  # Get all the MKV files in this dir and its subdirs
  find "$DIR" -type f -name '*.mkv' | while read filename
  do
    # Find out which tracks contain the subtitles
    # and get the number of the subtitle track 
    mkvmerge -i "$filename" | sed -n -e 's/^Track ID \([0-9]\+\): subtitles .*$/\1/p' | while read tracknumber
    do
      # Do a super-primitive language guess: ENGLISH
      # Corrected
      tracklanguage=`mkvmerge -F verbose-text -i "$filename" | sed -n -e '/^Track ID '"$tracknumber"':/s/.* language:\([a-z]\{3\}\) .*/\1/p'`
      [ "$tracklanguage" ] || tracklanguage="unknown"
      # Get base name for subtitle
      subtitlename=${filename%.*}
      # Get type for subtitle
      subtypename=`mkvmerge -F verbose-text -i "$filename" | sed -n -e '/^Track ID '"$tracknumber"':/s/.*(\(.*\)) .*/\1/p'`
      tracktype=`mkvmerge -F verbose-text -i "$filename" | sed -n -e '/^Track ID '"$tracknumber"':/s/.*codec_id:\([a-zA-Z\/_]*\) .*/\1/p'`
      [ "$subtypename" ] || subtypename=`echo ${tracktype} | sed -n 's/^\(.*\)\/.*$/\1/p'`
      # Determine extension from the subtitle type
      extension=`echo ${tracktype} | sed -n 's/^.*\/\(.*\)$/\L\1/p'`
      [ "$extension" ] || extension=`echo ${subtypename} | sed -n 's/^.*\/\(.*\)$/\L\1/p'`
      [ "$extension" ] || extension="txt"
# Adobe Encore DCD | FAB Subtitle | SubCreator 1.x / .txt
# Advanced Sub Station Alpha / .ass
# AQ Title / .aqt
# DKS Subtitle Format / .dks
# Karaoke Lyrics LRC / .lrc
# Karaoke Lyrics VKT / .vkt
# MacSUB / .scr
# Micro DVD | MPSub | Sofni | SubViewer 1.0 | SubViewer 2.0 / .sub
# MPlayer | MPlayes2 / .mpl
# Panimator / .pan
# Phoenix Japanimation Society / .pjs
# Power DivX / .psb
# SubRip / .srt
# Sub Station Alpha / .ssa
# ViPlay Subtitle File / .vfs
      # Extract the track to a .tmp file
      mkvextract tracks "$filename" $tracknumber:"$subtitlename.$extension.tmp" > /dev/null 2>&1
      chmod g+rw "$subtitlename.$extension.tmp"
      # Rename to the final name
      mv "$subtitlename.$extension.tmp" "$subtitlename-t$tracknumber-$tracklanguage.$extension" > /dev/null 2>&1
    done
  done
}
if [ ! "$(whereis -b mkvmerge | sed -n 's/^.*: \(.*\)/\1/p')" ]; then
  usage
  echo
  echo "  mkvmerge not found!"
  exit 1
fi
LIST=
FILE="."
# set -x
while (($#));do
  case $1 in
    -h|--help|-help)
        usage
        exit 0
        ;;
    -l|--list|-list)
        LIST=1
        ;;
     *) if [ -e "$1" ]; then
          FILE="$1"
        else
          usage
          echo
          echo "  ERROR: file or directory does not exist $1"
          exit 1
       fi
       ;;
  esac
  shift
done
[ "$LIST" ] && sublist "$FILE" || subext "$FILE"
:/
- A hozzászóláshoz be kell jelentkezni
 
sublist() {
  local filename
  local tracknumber
  local tracklanguage
  local tracktype
  local trackname
  local subtype
  local DIR=$1
  # Get all the MKV files in this dir and its subdirs
  find "$DIR" -type f -name '*.mkv' | sort | while read filename
  do
#    if mkvmerge -i "$filename" | grep -q "^Track ID [0-9]\+: subtitles"; then
      echo "`basename $filename`"
      mkvmerge -i "$filename" | sed -n -e 's/^Track ID \([0-9]\+\): subtitles .*$/\1/p' | while read tracknumber
      do
        # Get subtitle track properties
        subtype=`mkvmerge -F verbose-text -i "$filename" | sed -n -e '/^Track ID '"$tracknumber"':/s/.*(\(.*\)) .*/\1/p'`
        tracklanguage=`mkvmerge -F verbose-text -i "$filename" | sed -n -e '/^Track ID '"$tracknumber"':/s/.* language:\([a-z]\{3\}\) .*/\1/p'`
        trackname=`mkvmerge -F verbose-text -i "$filename" | sed -n -e '/^Track ID '"$tracknumber"':/s/.*track_name:\(.*\) uid.*/\1/p'`
        tracktype=`mkvmerge -F verbose-text -i "$filename" | sed -n -e '/^Track ID '"$tracknumber"':/s/.*codec_id:\([a-zA-Z\/_]*\) .*/\1/p'`
        if [ ! "$tracktype" ]; then
           tracktype="$subtype"
           subtype=`echo $tracktype | sed -n 's/^\(.*\)\/.*/\1/p'`
        fi
        echo "  Track ID $tracknumber: language:$tracklanguage trackname:$trackname type:$subtype - $tracktype"
      done
      echo
#    fi
  done
}
ez még elég kusza :))
de
$ mkvsubext.sh -l
**********-S01E01-*.mkv
  Track ID 2: language:hun trackname:Hungarian type:SubRip - SubRip/SRT
**********-S01E02-*.mkv
  Track ID 2: language:hun trackname:Hungarian type:SubRip - SubRip/SRT
**********-S01E03-*.mkv
  Track ID 2: language:und trackname: type:SubRip - SubRip/SRT
**********-S01E04-*.mkv
  Track ID 2: language:hun trackname:Hungarian type:SubRip - SubRip/SRT
**********-S01E05-*.mkv
  Track ID 2: language:hun trackname:Hungarian type:SubRip - SubRip/SRT
**********-S01E06-*.mkv
  Track ID 2: language:hun trackname:Hungarian type:SubRip - SubRip/SRT
**********-S01E07-*.mkv
  Track ID 2: language:hun trackname:Hungarian type:SubRip - SubRip/SRT
**********-S01E08-*.mkv
  Track ID 2: language:hun trackname:Hungarian type:SubRip - SubRip/SRT
**********-S01E09-*.mkv
  Track ID 2: language:hun trackname:Hungarian type:SubRip - SubRip/SRT
**********-S01E10-*.mkv
  Track ID 2: language:hun trackname:Hungarian type:SubRip - SubRip/SRT
**********-S02E00.mkv
  Track ID 2: language:eng trackname:English type:SubStationAlpha - S_TEXT/ASS
  Track ID 3: language:hun trackname:Hungarian type:SubRip - SubRip/SRT
**********.s02e01.***.mkv
  Track ID 2: language:eng trackname: type:SubStationAlpha - S_TEXT/ASS
**********.s02e02.***.mkv
  Track ID 2: language:eng trackname: type:SubStationAlpha - S_TEXT/ASS
$ mkvsubext.sh -l **********-S02E00.mkv 
**********-S02E00.mkv
  Track ID 2: language:eng trackname:English type:SubStationAlpha - S_TEXT/ASS
  Track ID 3: language:hun trackname:Hungarian type:SubRip - SubRip/SRT
$
- A hozzászóláshoz be kell jelentkezni
 
Szerintem a csillag az idézőjelben nem jó, a while feltétele meg azért rossz, mert elakad a paraméterek feldolgozása, ha valaki betesz a paraméterek közé egy üres stringet. Inkább így csinálnám:
while [ $# -gt 0 ]; do
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE- A hozzászóláshoz be kell jelentkezni
 
+1
Bar en a space-t tartalmazo filenevekkel se vagyok nagyon korultekinto ('mv $X $Y' vs 'mv "$X" "$Y"'), kicsit ugy vagyok vele, hogy aki ilyet csinal (space a filenevbe vagy ures string argumentumkent) az meg is erdemli! :)
- A hozzászóláshoz be kell jelentkezni
 
Én ki szoktam írni az idézőjeleket, törekszem arra, hogy minél általánosabb legyen a scriptem. Ugyanakkor mindenre nem készülök fel, például arra, ha newline karakter van filenévben. Most próbáltam ki, meg lehet csinálni. :)
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE- A hozzászóláshoz be kell jelentkezni
 
Az azé' nem egy nagy vasziszdasz.
=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?
- A hozzászóláshoz be kell jelentkezni
 
Hát speciel a net bugyraiből jövő tartalom esetén jó párszor találkoztam már szóközt, és egyéb gorombaságot is tartalmazó fájlnévvel.
=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?
- A hozzászóláshoz be kell jelentkezni
 
Jo, jo, igen. Mashogy kell dolgozni, hogyha kivulrol jovo akarmilyen file-okkal kell dolgozni, mintha egy sajat kvazi zart rendszerben fejlesztesz (ahol kb megmondhatod, hogy mi lehet vagy nem lehet egy file-nevben).
- A hozzászóláshoz be kell jelentkezni
 
En eleg sokszor ujrahasznositom a scriptjeimet reszben vagy egeszben, igy szoktam a szokozt tartalmazo fajlnevekre figyelni. Lehet, hogy egy script tok belsos, temp scriptkent kezdi a palyafutasat, de kesobb automatikusan indit streameket idozitetten.
--
Blog | @hron84
Üzemeltető macik
- A hozzászóláshoz be kell jelentkezni
 
Sőt, hiába „belsős” egy script, én például szoktam filenévbe szóközt írni.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE- A hozzászóláshoz be kell jelentkezni