[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: rename filenames



Op 26 maart 2013 10:51 heeft Max <maccus@warpmail.net> het volgende geschreven:
> (Kleine aanpassing mp3>${EXT} tov vorige reactie)
>
> Werkt dit niet gewoon? Lijstje met extensies zelf aanpassen.
>
> #!/bin/bash
>
> for EXT in mp3 MP3 ogg OGG; do
>     find . -type f -regex ".*[ ].${EXT}" | sort -d -r | while read X; do
>         Y="$(echo ${X} | sed "s|[ ]\.${EXT}|.${EXT}|")"
>         [ -f "${X}" ] && mv -v "${X}" "${Y}"
>     done
> done
> exit

Dat lijkt me niet zo efficiënt, die 'find' binnen de 'for'. Daardoor
wordt het find-commando (in dit geval) 4 maal uitgevoerd op dezelfde
directory-tree, waarbij steeds een andere subselectie wordt genomen.
Bovendien worden bestanden met mixed-case extensies (.Mp3, .Ogg)
overgeslagen.
Een robuust algoritme doorloopt in één keer de directory-tree, vist
daar de te wijzigen filenamen uit en hernoemt die. In 1 regel:

find -depth -name '* .*' -print0 | perl -wn0e '$orig = $_;
s/\s+\././g; rename($orig, $_) or warn "$orig: $!\n"'

Highlights:
- snel (slechts twee processen, parallel)
- geen problemen met het quoten van spaties
- geen probleem met filenamen die met een min-teken beginnen
- doet ook directory's


Vriendelijke groeten,
Arjen Bax


Reply to: