Назад | Перейти на главную страницу

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

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

Они делают это, обращаясь к серверу (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