Сценарий Bash: Пакетный файл переименовывает для удаления/изменения всех символов, недопустимых под файловой системой окон

Мне нужно помогание здесь, получил движение проекта, где мы должны изменить файл и имена папок в рамках определенного каталога, чтобы удалить или заменить любого и все символы, которые считали бы недопустимыми в соответствии с Windows с несколькими дополнительными символами. Покиньте финал extnsion

ILLEGAL CHARACTERS:

    < (less than)                         MAKE -
    > (greater than)                      MAKE -
    : (colon)                             MAKE -
    " (double quote)                      REMOVE
    / (forward slash)                     MAKE -
    \ (backslash)                         MAKE -
    | (vertical bar or pipe)              MAKE -
    ? (question mark)                     REMOVE
    * (asterisk)                          REMOVE


ADDITIONAL CHARACTERS:

    REMOVE '
    REMOVE %
    REMOVE #
    REMOVE ^
    REMOVE !@#$%^&()=+][{};,`~

Любой символ с "ДЕЛАЕТ -" рядом с ним, должен быть сделан - (дефис) вместо символа, например, файл по имени John\Sykes.doc должен стать John-Sykes.doc. Если символ отмечается, как "УДАЛЯЮТ" затем, он должен быть удален, и ничто не положено на, это - место, например, файл под названием John?Sykes.doc стал бы JohnSykes.doc

Это - довольно важный шаг в очень крупном проекте, у нас есть вход в нашу организацию, и я не смог создать сценарий к настоящему времени. Я знаю, как сделать простые версии, которые могут только изменить имена файлов на индивидуальной основе, но не могут сделать этого en масса. Например, я могу создать сценарий для удаления только из имен файлов, но я не знаю, как включать папки/каталоги, и при этом я не знаю, как включать все другие символы в этот сценарий.

Идеально сценарий работал бы в первый раз и произвел бы файл с помощью эха со всеми изменениями, которые должны быть внесены включая полный путь и затем измененный путь. Сценарий должен был бы затем или быть изменен немного для использования mv вместо этого, или он мог относиться к файлу, созданному с помощью эха, и выполнить все необходимые изменения с помощью него...

Любой и вся справка ценились бы, поскольку это действительно довольно важно, и я испытываю недостаток в навыках в данный момент для создания этого сам...

Заключительное примечание, я не могу использовать команду #rename. Это повреждает нашу политику IT.

Править

Я не могу использовать любую версию, переименовывают, глава моего отдела IT имеет, запретил его. Я уверен, что у него есть свои причины, но я не могу сказать, что я посвящен в них. Переименовать команда не доступна на наших серверах вообще.

Это означает, что я должен использовать чистый удар для выполнения операции.

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

Все, в чем я нуждаюсь, является вышеизложенным, таким образом, что-либо отмеченное "ДЕЛАЕТ -", должен стать дефисом, и что-либо отмеченное "УСТРАНЯЮТ" необходимости просто уйти.

Если существует что-либо еще, спросите. Я счастливо дам дальнейший комментарий.

1
задан 16 November 2015 в 18:05

1 ответ

Создайте сценарий rename1.sh:

#! /bin/bash
old=$1
new=${old//[\''"?*%#^!@$&()=+[]{};,`~']}
new=${new//['<>:\|']/-}                   # I removed /, see below.
if [[ -e $new ]] ; then
    if [[ $old != $new ]] ; then
        echo Cannot rename "$old" to "$new" - target already exists.
    fi
else
    mv "$old" "$new"
fi

Это переименовывает один файл согласно данным правилам с помощью расширения параметра. Для переименования поддерева выполните его с find:

find /path -exec rename1.sh {} \;

Вы уверены, что хотите заменить / с -? Это поместило бы все файлы в тот же каталог.

1
ответ дан 7 December 2019 в 16:06

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

Похожие вопросы: