|
| Shell script der flytter filer og opretter~ Fra : Jacob d'Andrade |
Dato : 29-09-05 18:44 |
|
Hej NG
Hvordan fixer jeg det, jeg har ca 1600 billeder, som jeg godt vil have
sorteret i mapper, alt efter filnavnet. filerne hedder f.eks
"honda_civic_9876186.jpg" ... Det alle billederne har til fælles, er at de
alle starter med nogle bogstaver, og med et _ skifter til tal, så det jeg er
på udkig efter, er en måde hvorpå jeg kan få et script til at læse det
første af filnavnet indtil den rammer nogle tal, og så bruge de dertil læste
bogstaver til at oprette en mappe og kopiere alle billeder der hedder det
samme, men blot med nogle andre tal ned i samme mappe.
Jeg har googlet lidt, men kunne ikke lige finde noget...
Håber der er nogen der lige kan fixe et lille shell script
Regards Jacob
| |
Kent Friis (29-09-2005)
| Kommentar Fra : Kent Friis |
Dato : 29-09-05 18:57 |
|
Den Thu, 29 Sep 2005 19:43:48 +0200 skrev Jacob d'Andrade:
> Hej NG
>
> Hvordan fixer jeg det, jeg har ca 1600 billeder, som jeg godt vil have
> sorteret i mapper, alt efter filnavnet. filerne hedder f.eks
> "honda_civic_9876186.jpg" ... Det alle billederne har til fælles, er at de
> alle starter med nogle bogstaver, og med et _ skifter til tal, så det jeg er
> på udkig efter, er en måde hvorpå jeg kan få et script til at læse det
> første af filnavnet indtil den rammer nogle tal, og så bruge de dertil læste
> bogstaver til at oprette en mappe og kopiere alle billeder der hedder det
> samme, men blot med nogle andre tal ned i samme mappe.
>
> Jeg har googlet lidt, men kunne ikke lige finde noget...
>
> Håber der er nogen der lige kan fixe et lille shell script
Her er noget du kan tage udgangspunkt i:
filnavn=honda_civic_9876186.jpg
echo ${filnavn%_*}
echo ${filnavn##*_}
(klipper dog ikke efter tallene, men efter sidste "_").
Mvh
Kent
--
Hard work may pay off in the long run, but laziness pays off right now.
| |
Jan Birk (30-09-2005)
| Kommentar Fra : Jan Birk |
Dato : 30-09-05 06:13 |
|
> Hvordan fixer jeg det, jeg har ca 1600 billeder, som jeg godt vil have
> sorteret i mapper, alt efter filnavnet. filerne hedder f.eks
> "honda_civic_9876186.jpg" ... Det alle billederne har til fælles, er at de
> alle starter med nogle bogstaver, og med et _ skifter til tal, så det jeg er
> på udkig efter, er en måde hvorpå jeg kan få et script til at læse det
> første af filnavnet indtil den rammer nogle tal, og så bruge de dertil læste
> bogstaver til at oprette en mappe og kopiere alle billeder der hedder det
> samme, men blot med nogle andre tal ned i samme mappe.
Til lidt inspiration:
----------------- go.sh --------------
#!/bin/bash
for billede in `ls` ; do
katalog=`echo ${billede%_*}`
if [ -d $katalog ]; then
mv $billede $katalog
else
mkdir $katalog
mv $billede $katalog
fi
done
------------------------------------
/Jan
| |
Kasper Dupont (01-10-2005)
| Kommentar Fra : Kasper Dupont |
Dato : 01-10-05 18:43 |
|
Jan Birk wrote:
>
> Til lidt inspiration:
Der er lige et par fejl og uhensigtsmæssigheder i det script.
>
> ----------------- go.sh --------------
> #!/bin/bash
> for billede in `ls` ; do
Den brug af ls er overflødig og vil give forkert resultat,
hvis der er mærkelige tegn som f.eks. mellemrum i filnavnene.
> katalog=`echo ${billede%_*}`
Her er brug af echo vist overflødig, og kan nok også give
problemer med mærkelige tegn. I øvrigt mangler der vist et
par " tegn.
> if [ -d $katalog ]; then
Det check kan man roligt springe over. Fejlmeldingerne fra
mkdir kan undertrykkes med -p.
> mv $billede $katalog
> else
> mkdir $katalog
> mv $billede $katalog
Tænk nu, hvis $katalog allerede findes men ikke er et
directory. Og der mangler vist en masse " tegn.
> fi
> done
> ------------------------------------
>
> /Jan
Her er mit bud til en forbedret udgave.
(Ikke testet)
#!/bin/bash
for billede in * ; do
katalog="${billede%_*}"
mkdir -p "$katalog" && mv "$billede" "$katalog"
done
--
Kasper Dupont
Note to self: Don't try to allocate
256000 pages with GFP_KERNEL on x86.
| |
Rene Joergensen (02-10-2005)
| Kommentar Fra : Rene Joergensen |
Dato : 02-10-05 09:10 |
|
Kasper Dupont <kasperd@daimi.au.dk> wrote:
> Den brug af ls er overflødig og vil give forkert resultat,
> hvis der er mærkelige tegn som f.eks. mellemrum i filnavnene.
Til det formål kan man ændre i IFS, start scriptet med:
IFS='
'
> Her er mit bud til en forbedret udgave.
> (Ikke testet)
>
> #!/bin/bash
> for billede in * ; do
Så må man håbe at der ikke er mange filer i det directory.
--
-René
| |
Klaus Alexander Seis~ (02-10-2005)
| Kommentar Fra : Klaus Alexander Seis~ |
Dato : 02-10-05 09:47 |
|
Rene Jørgensen skrev:
>> Den brug af ls er overflødig og vil give forkert resultat,
>> hvis der er mærkelige tegn som f.eks. mellemrum i filnavnene.
>
> Til det formål kan man ændre i IFS, start scriptet med:
>
> IFS='
> '
Hvad skulle det hjælpe? Linjer/ord deles op ved IFS-grænser, og nu har
du lige sat IFS=LF. Hvis LF skal beholdes i filnavnet, skal IFS sættes
til fx " " (mellemrum + tabulatortegn).
>> Her er mit bud til en forbedret udgave.
>> (Ikke testet)
>>
>> #!/bin/bash
>> for billede in * ; do
>
> Så må man håbe at der ikke er mange filer i det directory.
Så ku' man jo
#v+
$ find /sti/til/filer -type f -print0 | xargs -r0 kommando
#v-
hvor 'kommando' er det der skal gøre ved billederne.
Mvh,
--
Klaus Alexander Seistrup
Magnetic Ink, Copenhagen, Denmark
http://magnetic-ink.dk/
| |
Rene Joergensen (02-10-2005)
| Kommentar Fra : Rene Joergensen |
Dato : 02-10-05 10:24 |
|
Klaus Alexander Seistrup <klaus@seistrup.dk> wrote:
> Hvad skulle det hjælpe? Linjer/ord deles op ved IFS-grænser, og nu har
> du lige sat IFS=LF. Hvis LF skal beholdes i filnavnet, skal IFS sættes
> til fx " " (mellemrum + tabulatortegn).
Hvorfor skulle man ville beholde LF?
--
-René
| |
Christian Iversen (02-10-2005)
| Kommentar Fra : Christian Iversen |
Dato : 02-10-05 11:47 |
|
Rene Joergensen wrote:
> Klaus Alexander Seistrup <klaus@seistrup.dk> wrote:
>
>> Hvad skulle det hjælpe? Linjer/ord deles op ved IFS-grænser, og nu har
>> du lige sat IFS=LF. Hvis LF skal beholdes i filnavnet, skal IFS sættes
>> til fx " " (mellemrum + tabulatortegn).
>
> Hvorfor skulle man ville beholde LF?
Fordi det kan være en del af filnavnet.
--
M.V.H
Christian Iversen
| |
Klaus Alexander Seis~ (02-10-2005)
| Kommentar Fra : Klaus Alexander Seis~ |
Dato : 02-10-05 12:18 |
|
Christian Iversen skrev:
>> Hvorfor skulle man ville beholde LF?
>
> Fordi det kan være en del af filnavnet.
Men det er en smule akademisk, ikk'? Hvor almindeligt er det i praxis
at folk har filnavne der indeholder LF?
Mvh,
--
Klaus Alexander Seistrup
Copenhagen, Denmark
http://seistrup.dk/
| |
Hans Joergensen (02-10-2005)
| Kommentar Fra : Hans Joergensen |
Dato : 02-10-05 15:37 |
|
Klaus Alexander Seistrup wrote:
>> Fordi det kan være en del af filnavnet.
> Men det er en smule akademisk, ikk'? Hvor almindeligt er det i praxis
> at folk har filnavne der indeholder LF?
~ > locate LF|wc -l
113
~$ locate LF|wc -l
375
// Hans
--
http://rd350.nathue.dk - still smoking
| |
Kasper Dupont (02-10-2005)
| Kommentar Fra : Kasper Dupont |
Dato : 02-10-05 20:19 |
|
Klaus Alexander Seistrup wrote:
>
> Christian Iversen skrev:
>
> >> Hvorfor skulle man ville beholde LF?
> >
> > Fordi det kan være en del af filnavnet.
>
> Men det er en smule akademisk, ikk'? Hvor almindeligt er det i praxis
> at folk har filnavne der indeholder LF?
Jeg bruger det aldrig selv, men man er nødt til at være opmærksom på
muligheden. Afhængigt af hvem der vælger filnavnene, så kan det være
et sikkerhedshul.
--
Kasper Dupont
Note to self: Don't try to allocate
256000 pages with GFP_KERNEL on x86.
| |
Kasper Dupont (02-10-2005)
| Kommentar Fra : Kasper Dupont |
Dato : 02-10-05 20:28 |
|
Rene Joergensen wrote:
>
> Kasper Dupont <kasperd@daimi.au.dk> wrote:
>
> > Den brug af ls er overflødig og vil give forkert resultat,
> > hvis der er mærkelige tegn som f.eks. mellemrum i filnavnene.
>
> Til det formål kan man ændre i IFS, start scriptet med:
>
> IFS='
> '
Ikke godt nok. Filnavne kan indeholde *alle* tegn pånær / og NUL.
>
> > Her er mit bud til en forbedret udgave.
> > (Ikke testet)
> >
> > #!/bin/bash
> > for billede in * ; do
>
> Så må man håbe at der ikke er mange filer i det directory.
Begrænsningen gælder ved kald af eksterne kommandoer. Men for er
ikke nogen ekstern kommando, så der render man ikke ind i samme
problem:
[kasperd@hactar:pts/11:/tmp/mange] ls *
-bash: /bin/ls: Argument list too long
[kasperd@hactar:pts/11:/tmp/mange] for n in * ; do echo $n ; done|wc
30000 30000 168894
[kasperd@hactar:pts/11:/tmp/mange]
I øvrigt ville ls sådan som den blev foreslået anvendt ikke
hjælpe på det med antal argumenter:
[kasperd@hactar:pts/11:/tmp/mange] ls `ls`
-bash: /bin/ls: Argument list too long
[kasperd@hactar:pts/11:/tmp/mange]
Den eneste ulempe ved at bruge for med mange argumenter er
performance. Men har man så mange filer, at det er et problem,
så er et shell script nok det forkerte værktøj til opgaven.
Om det så bør løses med et perl script, et C program eller
noget tredje vil jeg ikke gøre mig til dommer over.
--
Kasper Dupont
Note to self: Don't try to allocate
256000 pages with GFP_KERNEL on x86.
| |
Jacob d'Andrade (30-09-2005)
| Kommentar Fra : Jacob d'Andrade |
Dato : 30-09-05 09:22 |
|
Hej igen
Jeg takker rigtig mange gange.
Mvh Jacob
"Jacob d'Andrade" <jacob@thezub.dk> skrev i en meddelelse
news:dhh94n$55g$1@daniella.thezub.dk...
> Hej NG
>
> Hvordan fixer jeg det, jeg har ca 1600 billeder, som jeg godt vil have
> sorteret i mapper, alt efter filnavnet. filerne hedder f.eks
> "honda_civic_9876186.jpg" ... Det alle billederne har til fælles, er at de
> alle starter med nogle bogstaver, og med et _ skifter til tal, så det jeg
> er på udkig efter, er en måde hvorpå jeg kan få et script til at læse det
> første af filnavnet indtil den rammer nogle tal, og så bruge de dertil
> læste bogstaver til at oprette en mappe og kopiere alle billeder der
> hedder det samme, men blot med nogle andre tal ned i samme mappe.
>
> Jeg har googlet lidt, men kunne ikke lige finde noget...
>
> Håber der er nogen der lige kan fixe et lille shell script
>
> Regards Jacob
>
| |
Jacob Sparre Anderse~ (02-10-2005)
| Kommentar Fra : Jacob Sparre Anderse~ |
Dato : 02-10-05 18:54 |
|
Klaus Alexander Seistrup skrev:
> Christian Iversen skrev:
>>> Hvorfor skulle man ville beholde LF?
>>
>> Fordi det kan være en del af filnavnet.
>
> Men det er en smule akademisk, ikk'? Hvor almindeligt er det i
> praxis at folk har filnavne der indeholder LF?
Ikke helt akademisk. Jeg plejer at have filer liggende med alle
mulige mærkelige navne (alle andre ISO-8859-1-tegn end NUL og /), men
det er nu mest for at genere de programmer jeg skriver.
Jacob
--
»I like it when the support group complains that they have
insufficient data on mean time to repair bugs in Ada
software.« -- Robert I. Eachus
| |
|
|