Удалите все специальные символы рекурсивно из имени файла [duplicate]

0
24.03.2016, 00:43
3 ответа

Самый простой способ - использовать zsh . Zsh является частью базовой установки OS X, но его необходимо устанавливать через диспетчер пакетов в большинстве дистрибутивов Linux и устанавливать из портов на * BSD. Zsh предоставляет функцию zmv , которая упрощает многие задачи переименования файлов. Сначала запустите это (или поместите в свой .zshrc , для интерактивного использования):

autoload zmv

Затем вы можете использовать либо

zmv '(**/)(*)' '$1${2//[^A-Za-z0-9]/_}'

, либо эквивалентный

zmv '**/*' '$f:h${${f:t}//[^A-Za-z0-9]/_}'

Первая zmv команда переименовывает все файлы, соответствующие ** / * (т.е. все файлы в текущем каталоге и подкаталогах рекурсивно), в файлы в том же каталоге ( $ 1 ) и с базовым именем, преобразованным в замените каждый соответствующий символ [^ A-Za-z0-9] на _ .Скобки в (** /) (*) приводят к тому, что часть пути каталога (все до последнего / ) назначается $ 1 и базовое имя файла на $ 2 . Вторая команда делает то же самое,но использует $ f для ссылки на полное исходное имя и модификаторы : h и : t для извлечения каталога и базовой части имени .


Ваш сценарий ломается по-разному, потому что он запускает различные специальные символы через их обработку оболочки вместо того, чтобы обрабатывать их буквально. Чтобы понять, почему, прочтите Почему мой сценарий оболочки подавляется пробелами или другими специальными символами?

0
28.01.2020, 04:51

Будьте осторожны с этим:

perl -pi -e 's/\W//g' $(find . -type f)

Вы можете создавать резервные копии, используя что-то вроде:

perl -pi.bak -e 's/\W//g' $(find . -type f)
0
28.01.2020, 04:51

Чтобы получить все имена файлов, вы должны полагаться на пустые удаленные строки:

find /your/path/ -print0 | while read -r -d $'\0' filename; do
    dn="`dirname "$filename"`"
    bn="`basename "$filename"`"
    bn_clean="`echo "$bn" | tr " \~()&'" "_______"`"
    file_clean="$dn/$bn_clean"
    if [ "$filename" != "$file_clean" ] ; then
        mv -fv "$filename" "$file_clean"
    fi
done
0
28.01.2020, 04:51

Теги

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