Groß-/Kleinschreibung von Dateinamen

Bei Linux ist die Schreibung von Dateinamen wichtig, im Unerschied zu Windows, welches keine Unterschiede in der Schreibung von Dateinamen macht.
Manchmal will man aber, wie bei Musiktiteln eine bestimmte Art der Schreibung erzwingen. Dazu muss man die Dateien umbenennen.
# for i in *; do new=`echo "$i" | sed -e 's/ ./\U&/g'`; mv "$i" "$new";done
Dieses Script setzt die Anfangsbuchstaben der Worte in Großbuchstaben.
IFS=$'\n' && for i in $(find . -type f -name "*[A-Z]*"); do echo "$i" "$(echo "$i" | sed -e s/./&L/)"; done ; unset IFS
Dieses Script setzt alle Dateinamen in Kleinbuchstaben um.
Mit rename
rename oldname newname *.filesbzw. innerhalb eines Loops mit Regex (alles in Kleinbuchstaben):
find my_root_dir -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \; oder einfacher:
rename 'y/A-Z/a-z/' *
Wenn man allerdings Sonderzeichen und nicht nur ASCII in den Dateinamen hat dann muss man das Ende mit -print0 abschließen:
find .  -type f -print0 | xargs -0n 1 bash -c \'s=$(dirname "$0")/$(basename "$0");d=$(dirname "$0")/$(basename "$0"|tr "[A-Z]" "[a-z]"); mv -f "$s" "$d"'
Mit rename und im Loop (nur der erste Buchstabe wird groß):
If you have access to perl rename, (installed by default as rename on Debian-based systems, available as perl-rename on many others), you could run:
rename 's/.*/lc($&)/e; s/(^| )./uc($&)/ge' *
Explanation:
The rename program will run a perl expression on each of its input file names. Here, the first substitution operation (s///) will replace everything (.*) with itself ($& is whatever was matched) but lower cased (lc($&)). The second, will match every character that's after a space or at the beginning of the file name ((^| )) and replace it with its upper cased version (uc($&)).
Run with the -n flag to test without making any changes:
$ rename -n 's/.*/lc($&)/e; s/ ./uc($&)/ge' *
rename NOT A FILE.ogg not A File.ogg
rename sensitive lalala.doc sensitive Lalala.doc
rename SomeThing.TXT something.txt
oder als perl scripr:
for f in *; do
mv "$f" "$(perl -lpe 's/.*/lc($&)/e; s/(^| )./uc($&)/ge'