Ispričavam se, mala greškica (
tr -cs je pisalo umjesto
tr -c) je bila zbog čega je više nečitljivih znakova zamijenjivala sa jednim _ a ne više njih. Slijedeće je u redu:
find . -type f | while read I; do N=$( echo -n $I | tr -c 'a-zA-Z0-9./' '_' ); if [ "$I" != "$N" ]; then echo "$I -> $N"; mv "$I" "$N"; fi done;
No ajmo je onda sistematizirati:
#!/bin/bash
find . -type f | while read I; do
N=$( echo -n $I | tr -c 'a-zA-Z0-9./' '_' );
if [ "$I" != "$N" ]; then
echo "$I -> $N";
mv "$I" "$N";
fi
done;
i proći pojedine dijelove:
find . -type f | while read I; do
Traži fileove te loopa za svaki file. Filename je sadržan u I.
N=$( echo -n $I | tr -c 'a-zA-Z0-9./' '_' );
S echo puštamo početni filne name kroz
tr -c koji zamjenjuje svaki znak koji ne matcha a-z A-Z 0-9 . ili / sa _. Echo ima -n parametar jer bi inače dodavao newline znak koji bi nam tr kasnije zamjenio sa _ pa bi nam svaki file imao dodatni _ na kraju, što ne želimo. Novi filename (sa izmijenjenim znakovima) spremamo u varijablu N.
if [ "$I" != "$N" ]; then
echo "$I -> $N";
mv "$I" "$N";
fi
Ukoliko početni i završni filename nisu isti (što znači da su imali neželjenih znakova unutra pa ih je gornji red zamjenio) ispišemo korisniku što i gdje renameamo te to učinimo.
Ova poruka je od: http://www.linux.hr/newbb/viewtopic.php?forum=8&topic_id=1889&post_id=11856