logi sisse meist KKK

Oleks vaja luua programm, mis suudaks muuta faililaiendit näiteks minujutt.TXT -> minujutt.txt . Kui fail on juba olemas võiks mingi veateate anda ja CTRL + C võiks töö lõpetada. Ise aga olen skriptimise maailmas uus ja kokku tegin mingi taolise esialgse testi.

#!/bin/bash

mkdir test
touch /home/test/minutekst.TXT

kasutamine () {
    echo
    echo "Kasutamine: `fail $0` <kaust> <vana laiend> <uus laiend>"
    echo 
}

if [ -z "$3" ]; then
    kasutamine
    exit 1
fi

vana_laiend=${2/#.}
uus_laiend=${3/#.}

find "${1}" -iname "*.${vana_laiend}" |
while read F
do
  uusFail="${F/%${vana_laiend}/${uus_laiend}}"
  echo "mv \"${F}\" \"${uusFail}\""
  mv -f "${F}" "${uusFail}"
done

exit 0

Vaja oleks muuta see selliseks, et kontrolliks kõiki parameetreid ning lõpp tulemus oleks näiteks kujul sh myshellscriptname.sh temporaryfolder temporaryfile filecase1 filecase2... kus temporary folder nime andes luuakse ajutine kaust , temporaryfile korral luuakse ajutine fail (näiteks: laul.txt või tere.mp3 või fail.TAR) filecase1 = sama faililaiend, mis oli temporaryfilel, filecase2 = formaat, millesse muutust soovitakse. filecase1 võib ka ära jääda kui tundub lihtsam.

küsitud Dec 30 '09 at 17:08

Ragnar's gravatar image

Ragnar
52

edited Jan 01 '10 at 20:27

Rene%20Saarsoo's gravatar image

Rene Saarsoo ♦♦
1.1k1720

Lugesin su seletuse mitmed korrad läbi, aga kohe mitte ei saanud aru, mida need filecase1 ja filecase2 parameetrid tegema peaksid. Mainin vaid seda, et bash ja sh on erinevad programmid - skripti algusesse on sul kirjutet #!/bin/bash (seega oleks nagu tegemist bashi skriptiga), siis aga käivitad sa seda sh käsuga. Kumba shelli sa siis nüüd ikkagi kasutada tahad?

(Jan 01 '10 at 20:36) Rene Saarsoo ♦♦

Ei ole vaja luua, rename tuleb Perliga juba kenasti kaasa. Kõnealune ümbernimetamine käib niimoodi:

$ rename 's/\.TXT$/.txt/' *.TXT

Pane ka tähele, et praegu konvertis üks inimene Sinu "minujutt.TXT" jutu spetsifikatsiooniks "suurte tähtedega kirjutatud laiend .TXT tuleb asendada väikeste tähtedega kirjutatud sama laiendiga". Masin ei oska sellist tõlkimist korralikult teha; selle peale, et Sa filecase1 sisse "minujutt.TXT" ja filecase2 sisse "minujutt.txt" panna võid ja masin siis "sinujutt.TXT"'d Sinu tahtmist mööda nimetada oskab, loota ei ole eriti kaval.

Erratum: rea keskel oli millegipärast üks ülearune kaldkriips. Parandatud.

link

vastatud Jan 02 '10 at 11:04

dig's gravatar image

dig
17415

edited Jan 03 '10 at 17:21

Lihtsam oleks vist ära kasutada Operatsioonisüsteemide enda nõkse:

Näiteks Linuxi ja Windowsi all toimib selline käsk täitsa edukalt, või on soov kindlasti teha bash script?

Windowsis:

rename fail.txt FAIL.TXT


rename .htm .html *.htm

Linuxis:

rename -n ’s/\.htm$/\.html/’ *.htm

$ rename -v 's/\.htm$/\.html/' *.htm
3.htm renamed as 3.html
4.htm renamed as 4.html
5.htm renamed as 5.html

Milleks leiutada jalgratast uuesti?

Ühe kaupa failide nimede muutmiseks:

mv tere tere.txt

mv -u tere1 tere2

No ja kui väga igav on siis tee see skript siis. Kuid ma ei saa aru milleks? Javas üks näide:

import java.io.*;

public class Rename {

      public static void main(String[] args) throws IOException {

        String EsimeneArgument;
        String TeineArgument;

        if ( args.length > 0 ) {
    	  EsimeneArgument = args[0];
    	  TeineArgument = args[1];

    	  File Vana = new File( EsimeneArgument );

    	  if ( !Vana.exists() ) {
    		System.out.println("Faili või kataloogi ei eksisteeri!");
    		System.exit(0); 
    	  }

    	  File Uus = new File( TeineArgument );

    	  System.out.println("Vana faili või katalooginimi: " + Vana );
    	  System.out.println("Uue faili nimi või katalooginimi: " + Uus );

    	  boolean Nimeta = Vana.renameTo( Uus );

    	  if ( !Nimeta ) {
    		System.out.println("Faili või kataloogi ümber nimetamine ebaõnnestus");
    		System.exit(0); 	  
    	  }

    	  else {
    		System.out.println("Faili või kataloogi ümber nimetamine õnnestus.");
    		System.exit(0);
    	  }   
        }
        else
    	  System.out.println("Failide ümber nimetamiseks sisesta parameetrid kujul [Vana failinimi] [Uus failinimi]");
      }
}
link

vastatud Jan 09 '10 at 18:33

Timo's gravatar image

Timo
2116

edited Feb 05 '10 at 18:32

Hetkel on see rename hea mõte, aga faililaiendeid on palju ja võiks kuidagi vabamalt muuta teiseks faililaiendiks.

link

vastatud Jan 04 '10 at 07:26

Ragnar%201's gravatar image

Ragnar 1
1

Vastuse kohta käiv kommentaar on parem panna kommentaarina selle vastuse külge. SO mootor võimaldab vaatajal vastuseid mitmes erinevas järjekorras vaadata ja mõnel juhul võib kommentaar kommenteeritavast päris kaugele sattuda.

(Jan 04 '10 at 08:46) Ahto Truu ♦♦

No kui laiendeid on palju, siis on kasulik ära õppida, kuidas rename'ile esimest argumenti kirjutatakse. Terve Perl on käsutada, võimalusi on kui mitte just piiramatult siis vähemalt lugematult.

Vihjena mainin 's/.w+$/lc $&/e' kui ühe põneva võimaluse ära.

(Jan 04 '10 at 12:56) dig

Äkki kellegil on oma lahendus või mingine mõte olemas ja saaks näidata korralikul kujul. Sisendiks näiteks failinimi ja võiks saada muuta siis ükskõik mis kujule. Oletame sisendfailil on arvuta.txt, siis sh failinimi.sh arvuta MP3. .txt muudetakse .MP3-ks, või sh failinimi.sh arvuta TXT . arvuta.txt -> arvuta.TXT.

Tänud.

(Jan 06 '10 at 13:31) Ragnar 1
#!/bin/sh

laiend1="$1"
laiend2="$2"

kasutus () {
  echo "Kasutamine: $0 faililaiendmidamuudetakse faililaiendmidasoovitakse"
  echo "Näide: $0 php PHP"
  echo "Näide: $0 PHP php"
}
if [ -z "$1" ] || [ -z "$2" ]
then
  echo "Argumente liiga vähe."
  kasutus
  exit 0
fi
if [ -n "$3" ]
then
  echo "Liiga palju argumente."
  kasutus
  exit 0
fi

flist=`find . -type f -name "*.$laiend1"`

muuda () {
  while read fail
  do
    uus=`echo "$fail" | sed "s/\(.*\.\)${laiend1}$/\1$laiend2/"`
    mv "$fail" "$uus"
  done
}

if [ -n "$flist" ]
then
  echo "$flist" | muuda
else
  echo "Pole faili, mida muuta."
fi

exit 0

Äkki keegi aitaks sellisel lahendusel selle rekursiivsuse ära kaotada ja viia kujule:

sh shelliskript.sh tere.txt tere.TXT

või 

sh shelliskript.sh tere.TXT tere.mp3

või

sh shelliskript.sh tere.TXT tere.txt

Tänud.

link

vastatud Jan 09 '10 at 14:54

Ragnar%202's gravatar image

Ragnar 2
11

Aga mingisugust rekursiivsust ju ei ole?

(Jan 09 '10 at 23:00) dig

Ma tean neid võimalusi, aga mulle oleks palju mugavam too lahendus, mida üleval pakkusin, aga kujul, et ma saaksin ühehaaval faile muuta, sest hetkel ta muudab kõik .png failid millekski teiseks faililaiendiks. Ja lisaks see töötab edukalt tar.gz-ga.

Aga võikski kaotada see nn "rekursiivsus" ja viia kujule failinimi.laiend -> failinimi.laiend2

Kuigi jah, lihtsamalt saaks asi ära lahendada. Lihtsus pole antud juhul tähtis. Mul on vaja skriptikujul ikkagi korralikult ülesehitatud skripti, koos kontrollidega.

Tänud.

link

vastatud Jan 10 '10 at 09:06

Ragnar%202's gravatar image

Ragnar 2
11

edited Jan 10 '10 at 09:28

tegelikult jääb ikkagi väga segaseks mida sa saavutada tahad. näitekskonkreetsemalt: 1) mida sa mõtled failide ühehaaval muutmise all 2) mida sa tahtsid öelda lausega "see töötab tar.gz-iga" 3) mis värk selle rekursiivse ja selle kaotamisega on? ps: shelliskiptis kontrollide kohta loe "man test"

(Jan 10 '10 at 19:58) sigamozart

Mul vaja too samane fail muuta kujule, et ma saaksin muuta command line alt nii: sh skriptinimi.sh fail.case1 fail.case2

Ta hetkel muudab ju kõik failid korraga ehk siis pmst rekursiivselt (kaudselt).

Oletame png PNG -> kõik png failid muudetakse PNG-ks.

Aga ma tahan oletame vaid faili pilt1.png muuta pilt2.PNG-ks

SELLE MA TAHAN olemasolevat muuta natuke, et ta vastaks nendele tingimustele. Mu ülesanne ei ole teha asja lihtsamalt.

Tänud.

(Jan 10 '10 at 20:43) Ragnar 2

Piirangud kehtivad, sest vaja on etteantud lahendus muuta seisust A seisu B, kus A on algseis (etteantud skript) ja seis B on minu soovitud tulemus sh skript.sh failinimi.laiend1 failinimi.laiend2.

Loodan, et tegin nüüd asja selgeks. Ma ei tohi kasutada ei ühtegi teist lahendust kui vaid see. Olgu neid lihtsamaid lahendusi kasvõi miljon. Konkreetselt on vaja see ülesanne toimima saada.

Tänud.

link

vastatud Jan 11 '10 at 13:56

Ragnar%202's gravatar image

Ragnar 2
11

Minupoole lahendus: http://pastebin.org/74392

ütleb mulle, et mv : cannot move fail.png to . No such file or directory (loodud on fail.png ilusti kaustas).

Miski sed probleem vist. Igastahes kuskil on mul mingi sünaksiviga. Äkki keegi vaataks üle ja üritan edasi samale kujule viia.

Tänud.

link

vastatud Jan 11 '10 at 17:08

Ragnar%202's gravatar image

Ragnar 2
11

Ma vist hakkan aru saama, et sa tahad skripti, mis leiaks parameetriteks antud failinimede laiendid ja nimetaks nende laiendite põhjal ümber kataloogis olevad failid. Näiteks nii:

$ ls
file1.php
file2.php
file3.tar
$ myrename foo.php foo.PHP
$ ls
file1.PHP
file2.PHP
file3.tar

Kui nii, siis peaks hakkama saama millegi sellisega:

#!/usr/bin/env bash

# Extracts extension from filename
extension () {
    if [[ $1 =~ [^.]+\.([^.]+)$ ]]; then
        echo ${BASH_REMATCH[1]}
    fi
}

if [ -z $2 ]; then
    echo "Usage: $0 <old-filename> <new-filename>"
    exit
fi


old_ext=$(extension $1)
if [[ -z $old_ext ]]; then
    echo "Filename $1 does not have extension."
    exit
fi

new_ext=$(extension $2)
if [[ -z $new_ext ]]; then
    echo "Filename $2 does not have extension."
    exit
fi


for name in $(find . -name "*.$old_ext" | sed -r 's/\.[^.]+$//'); do
    old_name=$name.$old_ext
    new_name=$name.$new_ext

    if [ -e $new_name ]; then
        echo "Can't rename $old_name to $new_name, $new_name already exists."
    else
        mv $old_name $new_name
    fi
done

Rekursiooni all mõtled sa äkki seda, et käiakse läbi ka alamkataloogid. Kui nii, siis lisa find käsu parameetrite hulka -maxdepth 1.

link

vastatud Jan 11 '10 at 17:45

Rene%20Saarsoo's gravatar image

Rene Saarsoo ♦♦
1.1k1720

Ma tänan. Lõpuks mõistlik lahendus. Ainus viga on see, et sa võiksid teha sama skripti ka selleks, et faile ükshaaval muuta. Et kui annan käsu skript.c skript.C - siis muudetakse vaid skript.c fail skript.C-ks ja teised .c failid jäetakse rahule.

Rene, natuke muudaksid, oleks ideaalne.

Sest ma saan kasutada nii su seda lahendust (paljude failide jaoks), kui ka teinekord oleks üksikuid faile muuta.

Tänud.

EDIT: isegi su kontrollid olid ideaalsed. Võid lisada viimasele skriptile, et kui fail olemas, siis öelda midagi. (Parim vastus).

link

vastatud Jan 11 '10 at 18:49

Ragnar%202's gravatar image

Ragnar 2
11

edited Jan 11 '10 at 19:25

Sellest ükshaaval muutmise asjast ma aga küll aru ei saa. Sa tahad, et see teeks teatud juhtudel sama mis lihtsalt mv käsk? Et myrename foo.c bar.C nimetaks ümber kõik .c failid aga myrename foo.c foo.C nimetaks ümber vaid foo.c? Kas see ohtlik ei tundu sulle, et näiteks kui trükid kogemata myrename foo.c foo.C asemel sisse myrename foo.c fooo.C ja nimetad ühe faili asemel kogemata kõik C failid ümber?

(Jan 11 '10 at 20:10) Rene Saarsoo ♦♦

Sinu lahendus on väga hea, aga see hetkel tegi nii: mul on kaustas foo.c, laulja.c, test.c ja suvaline.c, kui ma rakendan seda skripti kaustal (suvaline.c suvaline.C, siis lisaks suvaline.C muutusele muutuvad ka laulja.C, foo.C , test.C).

Ma tahaks, et skripti üldkuju jääks samaks, aga ta lihtsalt suvaline.c korral teeks suvaline.C või laulja.c korral teeks laulja.C (igaüks eraldi) (kaoks see terve kausta failide rename üldse ära) ja ei saaks teha (foo.bar fooooooo.bar2 ka)., oleksid 2 samasusuguse ülesehitusega skripti, aga toimimine erinev (üks muudab nagu hetkel - sinu poolt tehtud) ja see uus kasutades mv samamoodi ja tehes neid teste. (sama skript, teise funktsionaalsusega).

Palun aita see lihtsalt niimoodi ära teha ja ohtlikkus ja muu ei ole parameeter ega tähtis. Ma ise dokumenteerin. Hetkel on tähtis layout, mis sinu puhul mulle meeldis. Kõik toimis nii nagu peab.

Kordan üle. Samamoodi trükin foo.c foo.C ja failist saab foo.C (foo ehk failinimi, peab alati olema staatiline), laiend aga muutuv). ei muudeta teisi .c faile ega .xxx , kus xxx on siis suvaline faililaiend ega tehta muid asju. Tänan.

link

vastatud Jan 11 '10 at 20:29

Ragnar%202's gravatar image

Ragnar 2
11

edited Jan 11 '10 at 20:47

Sa tahad hoopis eraldi skripti, mis töötaks nagu mv? Nüüd ma ei saa enam millestki aru. Kogu see asi tundub mulle järjest kahtlasem. Kas see on sul mõni kooliülesanne? Või miks sa nii kiivalt saladuses pead, milleks sul sellist veidrat asja üldse tarvis on?

(Jan 11 '10 at 21:47) Rene Saarsoo ♦♦
Sinu vastus
toggle preview

Jälgi seda küsimust

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or __italic__
  • **bold** or __bold__
  • link:[tekst](http://url.com/ "pealkiri")
  • pilt?![alt tekst](/path/img.jpg "pealkiri")
  • nummerdatud nimekiri: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Pinu tööpakkumised

kõik pakkumised »

Sildid:

×1

küsitud: Dec 30 '09 at 17:08

nähtud: 859 korda

viimati uuendatud: Feb 05 '10 at 18:32

Sarnased küsimused

Litsents: Creative Commons Attribution License | Kontakt: info@pinu.ee