Szervusztok!
A kovetkezo problemam van: letoltok egy csomo mp3 file-t a netrol, de kb igy neznek ki a letoltott file-ok nevei: *.mp3flkjdhgdfjhgkjdfgkjlfdgkjklhjdkjfdhgjkh.
Ez igy nem tul szep. :(
Idaig qmv-vel toroltem ki a felesleget, de meguntam. Szeretnek shell scriptet irni erre. Neztem sed-et, cut-ot, tr-t, de nem igazan talaltam meg a megoldast. Mindegyiknel az a gond, hogy nem tudom megmondani neki, hogy az *.mp3 utani reszt vagja le.
Merre induljak, mire keressek?
- 1531 megtekintés
Hozzászólások
google -> regularis kifejezesek
---
"A legjobb dolgok az életben nem dolgok."
- A hozzászóláshoz be kell jelentkezni
nekem van egy ilyen man rename:
rename - renames multiple files
SYNOPSIS
rename [ -v ] [ -n ] [ -f ] perlexpr [ files ]
DESCRIPTION
"rename" renames the filenames supplied according to the rule specified
as the first argument. The perlexpr argument is a Perl expression
which is expected to modify the $_ string in Perl for at least some of
the filenames specified. If a given filename is not modified by the
expression, it will not be renamed. If no filenames are given on the
command line, filenames will be read via standard input.
For example, to rename all files matching "*.bak" to strip the exten‐
sion, you might say
rename 's/\.bak$//' *.bak
To translate uppercase names to lower, you’d use
rename 'y/A-Z/a-z/' *
OPTIONS
-v, --verbose
Verbose: print names of files successfully renamed.
-n, --no-act
No Action: show what files would have been renamed.
-f, --force
Force: overwrite existing files.
ENVIRONMENT
No environment variables are used.
AUTHOR
Larry Wall
SEE ALSO
mv(1), perl(1)
DIAGNOSTICS
If you give an invalid Perl expression you’ll get a syntax error.
BUGS
The original "rename" did not check for the existence of target file‐
names, so had to be used with care. I hope I’ve fixed that (Robin
Barker).
perl v5.8.8 2009-01-14 RENAME(1)
- A hozzászóláshoz be kell jelentkezni
Hamarjában valami ilyesmi is megteszi:
#!/usr/bin/perl -w
if ($#ARGV <= -1)
{
print "\aHívás: $0 \n";
exit(0);
}
my $mask = $ARGV[0];
my $new_name = $ARGV[0];
$mask =~ s/^.+[.]mp3//;
$new_name =~ s/$mask//;
print "$ARGV[0] ->> $new_name\n";
A vastag betűs rész mentsd el egy fájlba - pl.: "rename_mp3" , adj neki végrehajtási jogot és próbáld ki mondjuk így:
./rename_mp3 rocskaszegi.csűrdöngölős.mp3abrakadabra
Amit kiír az kell neked.
Ez a kis programocska persze csak a név végének levágását szemlélteti, de az átnevezés műveletét neked kell beletenned.
- A hozzászóláshoz be kell jelentkezni
Shell script (paraméternek egy filenevet vár, amiben minden sor egy átnevezendő mp3 elérési útja):
#!/bin/bash
if [ "$1" == "" ]; then echo "nem adtal meg filelistat"; exit; fi
cat $1 | while read fname
do
newname=`echo $fname | sed '/mp3.*$/mp3/'`
mv $fname $newname
done
- A hozzászóláshoz be kell jelentkezni
Koszi, ez lett belole:
#!/bin/bash
for i in *mp3*;
do
newname=`echo $i | sed 's/mp3.*$/mp3/'`
mv $i $newname
done
Viszont ezek a regularis kifejezesek homalyosak maradtak. :(
Asszem megvan mivel fogok mostansag megismerkedni.
- A hozzászóláshoz be kell jelentkezni
Csak hogy nehezítsem a tanulást:
#!/bin/bash
for i in *mp3*;
do
mv $i `basename "${i%%mp3*}"`mp3
done
Ez utóbbi egyébként nem regexp, hanem shell trükk :-)
- A hozzászóláshoz be kell jelentkezni
Trükk a fenét, jól kitalált értékadás egy változónak :-) Egy-egy jól irányzott "Parameter Expansion" sokat spórolhat az embernek :-)
- A hozzászóláshoz be kell jelentkezni
Ne kötekedjünk kérem, az ott *nem* értékadás. A többivel még egyet is értek.
- A hozzászóláshoz be kell jelentkezni
A szóközökre senki sem gondol?
#!/bin/bash
if [ ! -d "$1" ]; then echo "adj meg parametert"; exit 1; fi
OIFS="$IFS"; IFS='
'
for mp3 in $(find $1 -iname '*.mp3*'); do mv "$mp3" "${mp3%%.mp3*}.mp3"; done
IFS="$OIFS"
Pl: ./rename.sh /home/en/letoltott/mp3ak
Ez szépen rekurzívan átnevezi az adott könyvtártól indulva az összes ilyen mp3-at.
Viszont erre találták ki a rename parancsot, mint fentebb írták.
- A hozzászóláshoz be kell jelentkezni
Szokozoket, ekezetes karaktereket egy masik script-tel szedem ki, illetve fogom osszegyurni ezzel.
- A hozzászóláshoz be kell jelentkezni
Az értékadás kifejezés valóban nem helyénvaló, változó-behelyettesítés (vagy hogy a pékbe' kell helyesen írni...) megfelel? :-P
- A hozzászóláshoz be kell jelentkezni
Sziasztok!
Nem tudom, hogy illik-e másik topikjába belekotnyeleskedni, de én is hasonló problémával küszködök.
Van egy beadandó programom (shell script), aminek az egyik részfeladata egy átnevezés.
Én - a szokásostól eltérően - a rename paranccsal szerettem volna megoldani
A script összeállít egy reguláris kifejezést, majd azt átadva lefuttatja a rename-t, de a parancs nem hajtódik végre
A script:
prefix()
{
cd $2
regexp="'s/(\\w{0})/\$1$3/'"
echo $regexp
/usr/bin/rename -v $regexp *.jnlp
}
Ennek hatására a függvény a 2. paraméter ben megadott összes jnlp file-t kiegészít egy paraméterben ($3) megkapott taggal.
Ha lefuttatom a regexp értékével a rename parancsot parancssorból, akkor hibátlanul megcsinálja az átnevezéseket.
Ha viszont a shell scriptből indítom, akkor nem történik semmi.
A kér regexp (a parancssorból futtatott, és a shell scriptben legenerált) 100%-ban megegyezik (azért van az echo).
Mit rontok el?
A regexp kiiratva 100%-ban megegyezik a parancssorban használttal.
Minden segítséget előre is köszönök!
- A hozzászóláshoz be kell jelentkezni
Kicsit sok aoposztrófot meg idézőjelet használsz az értékadásnál, és kicsit keveset a rename -nél, ahol használnod kell.
prefix()
{
cd $2
regexp="s/(\\w{0})/\$1$3/"
echo "$regexp"
/usr/bin/rename -v "$regexp" *.jnlp
}
- A hozzászóláshoz be kell jelentkezni
1000 hála és köszönet
- A hozzászóláshoz be kell jelentkezni