Удалить все недопустимые символы из всех имен файлов в данной папке и подпапках

630
Tim Moseley

Я знаю, что на это был в основном ответ, и автомат с сценарием оболочки (Sanitize Filenames) прекрасно работает, но мне нужно, чтобы он также делал все подпапки. И, если возможно, обрежьте имя файла до 50 символов, сохранив расширение файла. Я нашел строку кода bash, которая усекала файл, но также лишала расширения, и это плохо работает при переносе этих файлов с Mac на Windows.

Сценарий, как он есть, это

for f in "$1"/*; do dir=$(dirname "$f") file=$(basename "$f") mv "$f" "$/$"  done  

Я не против использования яблочного скрипта в automator для выполнения этой задачи.

4
примечание: в unix / linux есть необязательная команда под названием «переименовать», и с помощью быстрого поиска в Google я обнаружил, что есть много похожих команд для mac. Я думаю, что вы должны проверить эти команды. Эти команды "переименования" используют выражения ** sed ** (регулярное выражение + другие) для создания окончательного имени. Giacomo Catenazzi 8 лет назад 0
Есть ли способ сделать это сделать подпапки? Я также пытаюсь урезать имя файла до 30 символов, сохраняя при этом расширение. Есть идеи? У меня есть это: mv "$ f" "$ / $ это прекрасно работает, но удаляет нужное мне расширение, поскольку файлы переносятся в систему Windows. Tim Moseley 8 лет назад 0
Я бы сделал что-то вроде '* (\. [^.] *)? $' В качестве регулярного выражения. Используя переименование или «find | sed | bash», где в sed я создаю команду mv Giacomo Catenazzi 8 лет назад 1

1 ответ на вопрос

0
Ziggy Crueltyfree Zeitgeister

Вы можете использовать find. Параметры в OSX / Darwin findнемного отличаются от параметров в других вариантах * nix, поэтому некоторые из этих функций могут быть вам недоступны, но вы поймете суть и сможете поиграть с опциями, которые у вас есть:

find -regextype posix-extended -regex '.*\/[^\/]*[[:cntrl:]\\:*?"<>|].*' -print \ -exec mv "{}" "$(echo "{}" | perl -ane 'chomp; s/[[:cntrl:]\\:*?"<>|]//g; print' -)"