Сценарий оболочки, чтобы исправить плохие имена файлов?

Я ЭТО в моей маленькой фирме; и, несмотря на мои страшные предупреждения, все помещают на сервер файлы с ужасными именами, включая пробелы в начале и в конце, плохие символы (включая \ ; / + . < > - так далее!)

Они делают это, обращаясь к серверу (FreeBSD/FreeNAS) через AFP на Mac, так что ни одна часть системы не жалуется.

Есть ли скрипт, который я могу использовать, чтобы пройти через все дерево каталогов и исправить неправильные имена файлов?

В основном заменить все пробелы и плохой ASCII с _... и если файл уже существует, просто нажмите _2 или что-то в конце.

Я не думаю, что есть способ заставить систему обеспечивать соблюдение правил именования файлов, не так ли?

2 ответа

Вы можете получить их список, используя find / -iname с шаблоном, чтобы соответствовать тому, что вы не хотите видеть (рассмотрите использование регулярного выражения, как [^:alnum:]). Это, вы можете манипулировать (например, с помощью sed) в сценарий оболочки, который будет использовать mv для переименования файлов.

Приемлемые имена файлов определяются файловой системой, поэтому может быть, а может и не быть способа обеспечить его без кроноборства.

@terdon предоставил элегантное 1-строчное решение для суперпользователя:

SAVEIFS=$IFS; IFS=$(echo -en "\n\b"); \
for i in $(find . -type f  -name "*[\:\;\>\<\@\$\#\&\(\)\?\\\%\ ]*"); \
do mv "$i" ${i//[\;><\@\$\#\&\(\)\?\\\%\ ]/_}; done; IFS=$SAVEIFS

(Разрывы строк добавлены для ясности; это все одна строка.)

Кроме того, вы можете стать более агрессивным с чем-то вроде

for i in $(find . -type f  -name "*[^0-9A-Za-z\_\.\-]*"); 

Полная информация здесь: https://superuser.com/questions/463742/shell-script-to-fix-bad-filenames

Другие вопросы по тегам