Заменить все недопустимые символы из папок, подпапок и файлов в моей папке Dropbox

592
Todd C

Наш офис использует Dropbox на Mac для организации наших дизайнерских проектов. В течение нескольких лет многие из этих файлов и папок сохранялись с символами, которые запрещены в ОС Windows. У нас есть несколько компьютеров с ОС Windows, которые мы должны добавить в наш офис. Это создало проблему, поскольку ни один из этих файлов не синхронизируется должным образом.

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

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

Возможно ли, чтобы такой скрипт включал все подпапки и файлы? Этот скрипт удаляет все пробелы и специальные символы, но ЗАМЕНА их подчеркиванием была бы намного лучше, если бы это было возможно.

Спасибо

0

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

0
G-Man
  • Самый простой способ получить скрипт slhck для рекурсивного поиска в подпапках и файлах, если вы используете bash, - это добавить, shopt -s globstarа затем изменить *на **. Это не будет работать правильно, если у вас есть каталоги с «нелегальными» символами в их именах. Вы можете обойти это, просто запустив скрипт n +1 раз, где n - максимальное количество каталогов с недопустимыми символами в любом пути. Например, если у вас есть f@catкаталог, dog#каталог под ним и fox!каталог под ним, вам нужно будет запустить сценарий четыре раза.

    Я даю лучший способ сделать это ниже.

  • Сценарий slhck действительно должен сказать mv -iвместо mv. Если у вас есть файлы с именами, скажем, cost+taxи cost-tax, сценарий переименует их в оба costtax (или cost_taxпосле того, как мы внесем это изменение). Это закроет первый файл вторым файлом. -i( Я опция Интерактивно) заставит mvпросить подтверждения. Вам придется обрабатывать такие столкновения, как это вручную.
  • Чтобы заменить «недопустимые» символы подчеркиванием, измените $на $ (или, что еще лучше, $).

Таким образом, с учетом вышеуказанных изменений, сценарий slhck становится

shopt -s globstar for f in "$1"/** do dir="$(dirname "$f")" file="$(basename "$f")" mv -i -- "$f" "$/$" done 

При выполнении этого обязательно убедитесь, что вы указали аргумент (например, .); в противном случае он попытается переименовать все файлы в файловой системе (начиная с /). Вы, вероятно, должны поместить что-то в скрипт, чтобы убедиться, что $1аргумент не нулевой.


Это имеет проблемы с каталогами с недопустимыми символами в их именах, потому что **расширяется до списка всех файлов и каталогов в поддереве $1с ветвями в порядке сверху вниз. Так что, если есть f@cat/dog#, то увидим f@catи в f@cat/dog#качестве аргументов. Так это будет переименовать f@catв f_cat, а затем искать f@cat/dog# - что больше не существует, так как он был переименован в f_cat/dog#. Мы можем исправить это, сделав

find "$1" -depth -name '*[^0-9A-Za-z._]*' -exec sh -c \ 'for f do dir="$(dirname "$f")"; file="$(basename "$f")"; mv -i -- "$f" "$/$"; done' sh {} + 

-depthВариант findговорит, что смотреть на ветви каталогов в снизу-сверху порядка. -nameДиректива заставляет его искать только в именах файлов, которые должны быть переименованы. (Другой сценарий выдаст сообщения об ошибках, когда попытается переименовать файлы для себя, поскольку в их именах нет недопустимых символов.) findЗатем эти имена передаются  в оболочку, которая выполняет то же действие, что и сценарий, но в виде одной команды. ,