bash ls tetszoleges konyvtarlista minden elemere

Azzal gorcsolok, hogy van egy DVD-nyi MP3, konyvtarakba rendezve. Minthogy kulonbozo helyekrol szarmaznak, egy resze ekezetes filenevet tartalmaz, sok helyen van szokoz a file neveben. Szeretnem egysegesiteni, ekezetes karakterek ekezetnelkulire, szokozok alahuzasjelre.
Az alabbi modokon probalkoztam:
#/bin/sh
for i in "`ls -1 -A`"
do
j=`echo $i | tr [áéíűő\ ] [őaei\_]`
mv $i $j
done

Aztan elmaradt a for, lett helyette "find *" majd "echo *" , de tokmindegy micsinaltam, akar "for" volt "ls"-sel, akar "find" vayg "echo", ha nem volt benne rekurzio, ha volt benne, az _egesz_ kimenetet belerakta a valtozoba.
Tudna nekem valaki segiteni? Egy tetszoleges konyvtarlista _minden_ elemere (egyenkent) vegrehajtani ugyanazt a parancsot?
Regebben mar megcsinaltam, mikor nagybetus file-ok voltak es azokat alakitottam kisbetusse, de mar nem emlekszem, hogyan :(

Hozzászólások

Szerintem két ciklus kell, valahogy így:
for i in * do
if [ -d $i ] ;then
pwd=`pwd`
cd $i
for j in * do
mv $j $ujnev
done
cd $pwd
fi
done
Nem kell futtatni, mert nem jól fut le ebben az állapotban.

ELaci

próbáld így:

find . -type f | while read file ; do mv "$file" "`echo $file | tr [áéíóőöüúűAEIÓÖŐÜÚŰ\ ] [aeiooouuuAEIOOOUUU_]`"; done

upsz, közben rájöttem, hogy ez így nem is jó..
mert tfh. van egy ilyen:
./Könyvtár/fájl
akkor ezt szeretné átmúvolni egy lépésben ./Konyvtrar/fajl nevűre, ami ugye nem jó, másrészt saját magát akadályozza, mert átnevezi a könyvtárat, de a következő lépésben már nincs olyan:)

a find egyébként alapból rekurzívan bejárja a fastruktúrát, de mindjárt írok egy jó szkriptet, mer ez trükkös.

O, en ket find-ot hasznaltam, elsoben find type d, masodikban type f, ezenkivul asszem -maxdepths opciot adtam meg, igy tenyleg rekurziv lett.
Meg a scriptet is ketszer futtattam le :)
Naigen, ugy nezem, amilyen mely a konyvtarszerkezet, kb. annyiszor klell lefuttatni :) Kozben rajottem, multkor hogyan csinaltam: egy ls kigyujtotte az osszes filet egy tmp file-ba, aztan ezt a tmp filet kezzel szeresztettem, vagyis mindegyik ele beirtam az mv-t neg a vegere a tr-t. Hat, egy konyvtarnal es 20 koruli file-nal elment, de itt kisse sok lenne :)
Nembaj, a fenti egesz jol mukszik :)

most akkor sikerült?
ilyesmi lenne egyébként egy megoldás:

find . | tail +2 | tac |
while read item ; do
parent=`dirname "$item"`
child=`basename "$item" | tr [áéíöőóüúűÁÉÍÖŐÓÜÚŰÍ\ ] [aeiooouuuAEIOOOUUU_]`
new_item="$parent/$child"
if [ "$new_item" != "$item" ] ; then mv "$item" "$new_item"; fi
done

Hali!

Látom, már megoldottad, de hátha megtetszik ez is.
Bár tudom, hogy ma már nem illik aszerint kiválasztani a funkciót, hogy milyen néven hívjuk meg, de nekem így jobb. :)


#!/bin/bash

usage ()
{
echo "This script converts between the uppercase and lowercase letters" >&2
echo "in the filenames." >&2
echo "usage:" >&2
echo " `basename $0` filespec [ filespec filespec ... ]          convert filenames" >&2
echo " `basename $0` [ -r ] filespec [ filespec filespec ... ]   recursive converting" >&2
echo " `basename $0` [ -h | -help | --help | -? ]                for this help" >&2
unset usage
exit 2
}

if [ $# = 0 ]; then
   usage
fi

if  [ "`echo "$@" | egrep "([:space:]|^)(\-h|\-help|\-\-help|\-\?)"`" ]; then
   usage
fi

if  [ "$1" = "-r" ]; then
   recursive="yes"
   shift
   if [ $# -lt 1 ]
   then
      usage
   fi
else
   recursive="no"
fi

case $0 in
   *lowercase)
      convert ()
      {
         tr "[:upper:]" "[:lower:]"
      }
      ;;
   *uppercase)
      convert ()
      {
         tr "[:lower:]" "[:upper:]"
      }
      ;;
   *dontaccent)
      convert ()
      {
         tr " űáéúőóüöíŰÁÉÚŐÓÜÖÍ" "_uaeuoouoiUAEUOOUOI"
      }
      ;;

esac

for arg in "$@"; do
   if [ -e "$arg" ]; then
      newarg=`echo $arg | convert`
      if [ "$arg" != "$newarg" ]; then
         echo $arg "->" $newarg >&2
         mv -- "$arg" "$newarg"
      fi
      if [ $recursive = "yes" -a -d "$newarg" ]; then
            $0 -r "$newarg"/*
      fi
   else
      echo "$arg not exists" >&2
      exit 2
   fi
done

unset usage convert recursive arg newarg

Bye, Fifi