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