Mar 21, 2012

Bash scripting: μαζική μετατροπή ονομάτων αρχείων από κεφαλαία (uppercase) σε πεζά (lowercase) γράμματα

Για τις ανάγκες ενός έργου, χρειάστηκε να γίνει μαζική επεξεργασία αρχείων που είχαν προέλθει από μεταφορά από ένα Windows σύστημα σε ένα Linux. Εδώ υπάρχει μια σημαντική διαφορά: το σύστημα αρχείων του Linux είναι case sensitive ενώ των Windows όχι, με αποτέλεσμα μεταδεδομένα (metadata) που προσδιορίζουν την τοποθεσία των αρχείων να μην είναι πια έγκυρα. Ένα script για την κανονικοποίηση των διαδρομών και των ονομάτων αρχείων στο Linux, ώστε όλα να είναι πεζά (lowercase) ακολουθεί. Σε πρώτο πέρασμα, επαναληπτικά, διορθώνονται τα ονόματα των καταλόγων (directories) Σε δεύτερο πέρασμα, διορθώνονται και τα ονόματα των αρχείων.

#!/bin/bash
# Lowercase recursively directories and files.
FILE_LOG=/tmp/massrename_$$.log
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
echo "Start" > "$FILE_LOG"

# Recursively lowercase directories.
while [ -s "$FILE_LOG" ];do
cat /dev/null > "$FILE_LOG"
find . -print0 -type d |while read -d $'\0' f; do mv -v "$f" "`echo $f |tr '[:upper:]' '[:lower:]'`" 2> /dev/null 1>> "$FILE_LOG"; done
done

# Lowercase files.
find . -print0 -type f|while read -d $'\0' f; do mv "$f" "`echo $f |tr '[:upper:]' '[:lower:]'`" 2> /dev/null; done

IFS=$SAVEIFS

No comments: