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 :(
- 2231 megtekintés
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
- A hozzászóláshoz be kell jelentkezni
próbáld így:
find . -type f | while read file ; do mv "$file" "`echo $file | tr [áéíóőöüúűAEIÓÖŐÜÚŰ\ ] [aeiooouuuAEIOOOUUU_]`"; done
- A hozzászóláshoz be kell jelentkezni
Koszi, ez mukodik :) Hibauzit dob, ha nincs benne helyettesitendo karakter, de fut tovabb. Mar csak rekurzivva probalom tenni (ne kelljen 37 konyvtaron es alkonyvtaron egye3sevel lefuttatni) meg a directory-kat is kezelje.
De amugy alapbol a file-okra jo, koszi!
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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 :)
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Igen, koszi, az elozo alapjan mar megoldottam.
Mondjuk, az *.m3u file-okat mar felig kezzel csinaltam meg hozza :)
De a lenyeg, hogy az atnevezes auotamat volt :)
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni