[linux bash] recusive files renamen

Pagina: 1
Acties:

  • usr-local-dick
  • Registratie: September 2001
  • Niet online
Misschien simpel maar ik kan het niet vinden.
Ik heb een directory tree en ik wil alle files folder.jpg die erin voorkomen renamen naar cover.jpg. Heb al geprobeerd:

code:
1
for file in $(find . -name folder.jpg -print); do mv $file cover.jpg; done

maar in de directory namen zitten spaties ....

  • RvdH
  • Registratie: Juni 1999
  • Laatst online: 19-02 14:54

RvdH

Uitvinder van RickRAID

usr-local-dick schreef op 14 april 2004 @ 12:01:
Misschien simpel maar ik kan het niet vinden.
Ik heb een directory tree en ik wil alle files folder.jpg die erin voorkomen renamen naar cover.jpg. Heb al geprobeerd:

code:
1
for file in $(find . -name folder.jpg -print); do mv $file cover.jpg; done

maar in de directory namen zitten spaties ....
find . -name folder.jpg -exec mv \{\} cover.jpg \;

  • blaataaps
  • Registratie: Juli 2001
  • Niet online
De spaties kun je escapen met ' of ", maar weet je zeker dat dit doet wat je wilt? Volgens mij krijg je nu namelijk mv path/to/folder.jpg cover.jpg , waarbij je dus elke folder.jpg stuk voor stuk verplaatst naar cover.jpg in je working directory, waardoor je ze effectie kwijtraakt, en alleen de laatste bewaard blijft als ./cover.jpg

  • Wilke
  • Registratie: December 2000
  • Laatst online: 19:24
Als je reageert met 'dat kan best op de een of andere manier', reageer dan niet.

Reply getrashed.

Wat blaataaps zegt, dit gaat niet helemaal goed dus ;)

Je moet escapen met dubbele quotes "$file" dus, als je het met enkele doet gaat hij letterlijk proberen een bestand dat $file heet te verplaatsen.

Hoe het dan wel moet:

code:
1
for file in $(find . -name folder.jpg -print); do mv "$file" `dirname "$file"`/cover.jpg; done


Als je 'm niet precies begrijpt check dan eerst eens wat de tooltjes 'basename' en 'dirname' precies doen als je die nog niet kent :)

(ik heb dit niet getest dus er kan een fout in zitten, met 'move' is dat nogal gevaarlijk dus probeer het eerst ff uit met 'echo'!)

[ Voor 40% gewijzigd door Wilke op 14-04-2004 12:11 ]


  • Wilke
  • Registratie: December 2000
  • Laatst online: 19:24
Nu het daar toch over gaat brengt me dat op een paar basisregels van dit soort scriptjes schrijven:
  • Test het eerst met 'echo' ipv het echte commando
  • Test het eerst op een speciaal gemaakte proefdirectory
  • Schrijf/test zo'n scriptje nooit als root, een onhandige 'find' in combinatie met het verkeerde soort commando (mv, cp, rm, maar i.h.a. alles wat een file bewerkt) en je mist ineens een boel files, of hebt er een zooi corrupt gemaakt.
Yup, krachtige shellscripting heeft ook zijn negatieve kanten. Gelukkig kan ik er zelf geen dramatische anecdotes uit eigen ervaring over vertellen, maar er zijn hier vast wel mensen die wel een 'onhandige' scripting-actie op hun naam hebben staan (vertel!) ;)

Verwijderd

Wilke, beetje offtopic, maar is het geen idee daar een "Het Grote ..." topic van te maken? Brengt een hoop lol ;) en waarschijnlijk nog wel meer van dit soort handige tips :)

  • Wilke
  • Registratie: December 2000
  • Laatst online: 19:24
Krause, zoiets bestaat al:

Het grote "handige scripts" topic

Maar een topic met grappen over mislukte scripts lijkt me wat overdreven, als het erg leuke/domme resultaten gaf past het vast ook wel in Non-windows humor, part 2 :) .

Ja, een beetje offtopic is het wel hier, maar ik denk dat de vraag van TS inmiddels al wel beantwoord is.

  • usr-local-dick
  • Registratie: September 2001
  • Niet online
ik denk dat de vraag van TS inmiddels al wel beantwoord is.
Nou niet helemaal :)
Dat dubbele quote werkt niet helemaal, als ik het eerste probeer met echo:

code:
1
for file in $(find . -name folder.jpg -print); do echo "$file"; done


Dan krijg ik nog steeds losse worden in de variable:

./ABBA
-
Gold
Greatest
Hits/folder.jpg
./ACDC
-
If
You
Want
Blood
You've
Got
It/folder.jpg
./ACDC
-
Let
There
Be
Rock/folder.jpg
./Aerosmith
-
Greatest
Hits/folder.jpg
./Anouk
-
Together
Alone/folder.jpg
./Apocalyptica
-
Plays
Metallica
by
Four
Cellos/folder.jpg
./Articolo

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 16:37

Robtimus

me Robtimus no like you

RickJansen schreef op 14 april 2004 @ 12:03:
find . -name folder.jpg -exec mv \{\} cover.jpg \;
find . -name folder.jpg -exec echo \{\} \; werkt hier uitstekend (uiteraard iets anders ipv folder.jpg ;))

Je moet alleen nog ff werken met dirname etc.

[ Voor 9% gewijzigd door Robtimus op 14-04-2004 14:52 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • usr-local-dick
  • Registratie: September 2001
  • Niet online
IceManX schreef op 14 april 2004 @ 14:49:
[...]
find . -name folder.jpg -exec echo \{\} \; werkt hier uitstekend (uiteraard iets anders ipv folder.jpg ;))

Je moet alleen nog ff werken met dirname etc.
code:
1
find . -name folder.jpg -exec cp -v \{\} `dirname \{\}`.test.txt \;
werkt wel, maar de dirname wordt niet geparsed :?

`./Urban Dance Squad - Persona Non Grata/folder.jpg' -> `..test.txt'
`./Van Halen - 1984/folder.jpg' -> `..test.txt'
`./Van Halen - Van Halen/folder.jpg' -> `..test.txt'
`./Whale - We Care/folder.jpg' -> `..test.txt'
`./White Zombie - La Sexorcisto Devil Music, Vol. 1/folder.jpg' -> `..test.txt'
`./White Zombie - Supersexy Swingin\' Sounds/folder.jpg' -> `..test.txt'
`./2 Unlimited - No Limits/folder.jpg' -> `..test.txt'
`./2Pac - Better Dayz CD1/folder.jpg' -> `..test.txt'
`./4 Non Blondes - Bigger, Better, Faster, More/folder.jpg' -> `..test.txt'

  • usr-local-dick
  • Registratie: September 2001
  • Niet online
Heb het nu werkend maar of ik het 100% snap....
code:
1
find . -name folder.jpg -exec bash -c 'cp -v "$1" "$(dirname "$1")"/cover.jpg' {} {} \;


`./Van Halen - Van Halen/folder.jpg' -> `./Van Halen - Van Halen/cover.jpg'
`./Whale - We Care/folder.jpg' -> `./Whale - We Care/cover.jpg'
`./White Zombie - Astro Creep 2000 -- Songs of Love, Destruction/folder.jpg' -> `./White Zombie - Astro Creep 2000 -- Songs of Love, Destruction/cover.jpg'
`./White Zombie - La Sexorcisto Devil Music, Vol. 1/folder.jpg' -> `./White Zombie - La Sexorcisto Devil Music, Vol. 1/cover.jpg'
`./White Zombie - Supersexy Swingin\' Sounds/folder.jpg' -> `./White Zombie - Supersexy Swingin\' Sounds/cover.jpg'
`./2 Unlimited - No Limits/folder.jpg' -> `./2 Unlimited - No Limits/cover.jpg'
`./2Pac - Better Dayz CD1/folder.jpg' -> `./2Pac - Better Dayz CD1/cover.jpg'

:)

  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
usr-local-dick schreef op 14 april 2004 @ 15:28:
werkt wel, maar de dirname wordt niet geparsed :?
Jawel, maar het stuk tussen backticks (`dirname \{\}`) wordt vervangen op het moment dat je find uitvoert, niet voor elke gevonden file.

edit:
En inmiddels ben je er zelf uit :)

[ Voor 9% gewijzigd door _Squatt_ op 14-04-2004 15:41 ]

"He took a duck in the face at two hundred and fifty knots."

Pagina: 1