Я ИТ-специалист в своей небольшой фирме; и, несмотря на мои ужасные предупреждения, все помещают файлы на сервер с ужасными именами, включая начальные и конечные пробелы, плохие символы (включая \ ; / + . < > -
и т.д!)
Они делают это, обращаясь к серверу (FreeBSD / FreeNAS) через AFP на Mac, поэтому никакая часть системы не жалуется.
Есть ли сценарий, который я могу использовать для просмотра всего дерева каталогов и исправления неправильных имен файлов?
В основном замените все пробелы и плохой ASCII на _
... и если файл уже существует, просто нажмите _2
или что-то в конце.
Я не думаю, что есть способ заставить систему принуждать есть хорошие соглашения об именах файлов?
Вы можете получить их список, используя find / -iname
с шаблоном, который соответствует тому, что вы не хотите видеть (рассмотрите возможность использования регулярного выражения, например [^:alnum:]
). Этим вы можете манипулировать (например, с помощью sed) в сценарий оболочки, который будет использовать mv для переименования файлов.
Допустимые имена файлов определяются файловой системой, поэтому может быть, а может и не быть способа принудительно применить это без задания cron.
@terdon предоставил элегантное однострочное решение для суперпользователя:
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