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

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

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

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

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

Спасибо

1 ответ

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

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

  • Сценарий SLHKK действительно должен сказать mv -i вместо mv, Если у вас есть файлы с именем, скажем, cost+tax а также cost-tax скрипт переименует их обоих в costtax (или же cost_tax после того, как мы сделаем это изменение). Это закроет первый файл вторым файлом. -i (интерактивный) вариант вызовет mv просить подтверждения. Вам придется обрабатывать такие столкновения, как это вручную.
  • Чтобы заменить "недопустимые" символы подчеркиванием, измените ${file//[^0-9A-Za-z.]} в ${file//[^0-9A-Za-z.]/_} (или, еще лучше, ${file//[^0-9A-Za-z._]/_}).

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

shopt -s globstar
for f in "$1"/**
do
  dir="$(dirname "$f")"
  file="$(basename "$f")"
  mv -i -- "$f" "${dir}/${file//[^0-9A-Za-z._]/_}"
done

При выполнении этого, обязательно убедитесь, что предоставили аргумент (например, .); в противном случае он попытается переименовать все файлы в файловой системе (начиная с /). You should probably put something in the script to verify that the $1 argument is not null.


This has problems with directories with illegal characters in their names because the ** expands to a list of all the files and directories in the sub tree under $1 with branches in top-to-bottom order. So, if you have f@cat/dog#, it will see f@cat а также f@cat/dog# в качестве аргументов.  So it will rename f@cat в f_cat, and then look for f@cat/dog# — which no longer exists, because it has been renamed to f_cat/dog#, We can fix that by doing

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

-depth возможность find tells it to look at directory branches in bottom-to-top order. -name directive causes it to look only at file names that need to be renamed. (The other script will give error messages when it tries to rename files to themselves, because their names don't have any illegal characters.) find then passes the names to a shell that does the same thing as the script, but as a single command.

Другие вопросы по тегам