PowerShell: Rene Pärnpuu, renamer.sh

From ICO wiki
Jump to navigationJump to search

Kirjeldus

Skript otsib kaustast, kus ta ise asetseb ülesse kõik .mp3 laiendiga failid ning muudab nende failide nimesi kaotades ära üleliigsed märgid: ".,_?!#" jms ning numbrid/tühikud failide eest. Skripti eesmärk on teha koledatest failinimedest arusaadavamad failinimed. Skriptile on kaasa antud fail: testfailid.sh, mis tekitab näidisfaile, mille järgi veenduda skripti effektiivsuses või lihtsalt vaadata, kuidas ta töötab.

Ülesehitus

Skript võib töötada ilma sisendita, kuid kasutaja saab sisse anda ka folderi, lisades -d folder peale skripti käivituse käsku. Lisaks saab kasutaja kaotada failinimedest ära soovimatud sõnad ja tähed andes lihtsalt peale skripti käivitamise käsku või peale folderit sõna. Parameetrid peavad olema eraldatud tühikuga! Skript ei saa töödata, kui parameeter (folder) peale -d ei eksisteeri. Skript on täielikult kommenteeritud, et täpsem kirjelduse ja loogika saab välja lugeda kommenteerijadest.


Skripti kasutamise näited

Alati ennem järgnevaid käske pannes: ./testfailid.sh

./renamer.sh

./renamer.sh -d /home/tudeng/Music ( muudab kõik mp3 failide nimed /home/tudeng/Music folderis)

./renamer.sh a, b, c ( muutab skripti folderis olevad mp3 failide nimesi ning kustutab ära tähed: a, b ja c failinimest. NT: 1adbecf.mp3, pärast def.mp3)

./renamer.sh -d /home/tudeng/Music a, b, c ( teeb sama asja, mis ülalolev näide, kuid võtab failid teisest kohast)

testfailid.sh

#!/bin/bash
rm -r *.mp3*
touch Type\ O\ Negative\ -\ 3\ 0\ i\ F.mp3 
touch Type\ O\ Negative\ -\ Summer\ Breeze.mp3 
touch Apocalyptica\ -\ Heat.mp3 .
touch  Apocalyptica\ -\ Seemann\ \[album\ Version\].mp3 
touch 42\ on.mp3
touch abc.mp3
touch 21hey.mp3
touch a_b,c.mp3
touch roflabc.mp3
touch defabc.mp3
touch teabcst.mp3
find . -type f -name "*.mp3" | while read oldName
do
echo $oldName
done

renamer.sh

<source lang="bash">

  1. !/bin/bash
  2. Autor: René Pärnpuu
  3. Rühm: A21
  4. Script mp3 nimede muutmiseks.

directory=`dirname $0` #ütleme, et folder, kus script asub on sisend (algväärtustamine) if [ $# -gt 1 ]; #kui parameetreid on rohkem kui 1 then

 if [ "$1" = "-d" ]; #kui esimene sisend on -d siis tähendab, et folder on kusagil mujal
 then
   if [ -d "$2" ]; #kontrollime, kas folder eksisteerib
   then 
     directory=$2 #juhul, kui on olemas siis väärtustame
   else
     echo "ERROR: Directory does not exist.\n" #kuna kasutaja folder ei eksisteeri siis
     echo "Exiting program, no changes done!" #lõpetame programmi
     exit 0
   fi
 fi

fi find . -type f -name "*.mp3" | while read oldName # otsi kõik failid, mis sisaldavad mp3e do

 oldName=${oldName:2} # kaotab ära ./
 newName="" #algväärtustame lõpliku failinime
 wasDir=0
 mp3=$oldName
 for arg in $* # fori tsükkel, mis võtab ükshaaval skripti sisendeid
 do
   if [ "$arg" = "-d" ]; # kui taheti sisse anda folder
   then
     wasDir=1 # tõstame püsti lipu, et järgnev parameeter on folder
   elif [ $wasDir -eq 1 ];
   then
     wasDir=0 # võtame maha lipu, et järgnevad parameetrid oleksid regexi jaoks!
   else
     mp3=${mp3//$arg/""} # kaotab failinimest ära skriptisisendi
   fi
 done
 mp3=`echo $mp3 | tr '[A-Z]' '[a-z]'` #muudame kõik tähed väikeseks
 mp3=`echo ${mp3//[._,#!?%]/" "}` #kaotab ära special characterid
 if [ "$mp3" = "mp3" ]; # kui failinimest ei ole midagi järgi enam, juhtub kui failinimi koosnebki ainult numbridest
 then
   continue # võtab järgmise sõna
 fi
 mp3=${mp3//" mp3"/".mp3"} # kuna punkt on kustutatud siis tekitame taas tagasi faili laiendi
 algus=0 # esimeste numbrite removemiseks ainult
 for sona in $mp3 # lõikame failinime sõnadeks  
 do
   sub=0 #algväärtustame substringi asukoha
   char=0 #algväärtustame tähe
   if [ $algus -eq 0 ]; then
   while  [ $char -gt -1 2>/dev/null ]; # kuni tegemist on numbriga 
   do
     let sub=sub+1 #suurendame subi ühe võrra
     char=${sona:$sub-1:1} #võtame ükshaaval tähe sõnast
     if ! [ -n $char ]; then # kui täht on tühik 

char=0 # väärtustame nulliks, et tsüklisse tagasi tuleks ja uue tähe võtaks continue

     elif [ "$char" = "." ]; then # kontolllib kas failinimes on ainult numbreid

continue # sellisel juhul on kummalise nimega tegemist, aga siiski vajalik

     elif [ "$char" = "[" ]; then

let sub=sub+1 nextLetter=${sona:$sub-1:1} char="$char$nextLetter"

     elif [ "$char" = "(" ]; then

let sub=sub+1 nextLetter=${sona:$sub-1:1} char="$char$nextLetter"

     fi
     char=`echo $char | tr '[a-z]' '[A-Z]'` # muudame tähe suureks
     algus=1
   done
   else
       char=${sona:0:1}

if [ "$char" = "[" ]; then char=${sona:0:2} sub=2 elif [ "$char" = "(" ]; then char=${sona:0:2} sub=2 else sub=1 fi char=`echo $char | tr '[a-z]' '[A-Z]'` # muudame tähe suureks

   fi
   sona=${sona:$sub} #võtame ülejäänud osa ilma suuretäheta
   newName="$newName$char$sona " #liidame uuele nimele sõna  
 done
 newName=`echo $newName | sed 's/ *$//g'` # 
 if [ "$newName" != " .mp3" ]; then
   if ! [ -f "$directory/$newName" ]; then #kui faili ei eksisteeri
     if [ -w "$directory/$oldName" ]; then #kui kasutajal on liigutamiseõigusi

mv -f "$directory/$oldName" "$directory/$newName" echo "'$oldName' succesfully renamed to '$newName'"

     else

echo "ERROR: Can´t rename $oldName! No rights for file!"

     fi
   else
     echo "File '$newName' already exists!"
   fi
 fi

done ls | grep mp3