У меня есть список файлов в каталоге, но некоторые из них имеют странные символы в имени. Как я могу переименовать только эти файлы, чтобы удалить эти символы?

Компьютерная ОС Red Hat, кодировка UTF-8.

Список файлов

2 ответа2

2

Попробуйте детокс. Со страницы руководства:

название

Детокс - очистить имена файлов

конспект

detox [-hnLrv] [-s -sequence] [-f -configfile] [--dry-run] [--special] файл ...

Описание

Утилита detox переименовывает файлы, чтобы с ними было легче работать. Это удаляет пробелы и другие подобные раздражения. Он также будет переводить или очищать символы Latin-1 (ISO 8859-1), закодированные в 8-битном ASCII, символы Unicode, закодированные в UTF-8, и экранированные символы CGI.

Последовательности

Детокс управляется настраиваемым рядом фильтров, называемых последовательностью. Последовательности более подробно описаны в detoxrc (5) и могут быть обнаружены с помощью опции -L. Некоторыми примерами последовательностей по умолчанию являются iso8859_1 и utf_8.

Он доступен в репозиториях RHEL 6, когда я последний раз проверял. Я не уверен насчет RHEL 7. Прежде чем приступить к фактической очистке, рекомендуется запустить detox с ключом -n (всухую). Например: detox -rn /somedir .

0

Если вы не можете использовать detox или хотите больше контролировать новые имена файлов, вы можете использовать стандартные инструменты.

ls с выводом на терминал показывает непечатаемые символы как ? , Если отображаемое имя (например, ab?cd) является уникальным (ls ab?cd показывает один файл) вы можете просто использовать эту маску в команде mv :

mv ab?cd ab_cd

ls -b показывает непечатаемые символы в качестве escape-последовательностей (например, ab\001cd), хотя вы не можете использовать отображаемое имя в другой команде, но он позволяет вам увидеть все затронутые файлы:

ls -b|grep '\\'     ; # includes names with embedded spaces
ls -b|grep '\\[^ ]' ; # excludes names with embedded spaces

ls с выводом в файл или канал записывает буквальное имя файла: в этом случае вы можете получить список имен файлов с непечатными файлами с:

ls|env LC_ALL=C grep '[^!-~]' ; # includes names with embedded spaces
ls|env LC_ALL=C grep '[^ -~]' ; # excludes names with embedded spaces

Теперь вы можете направить этот вывод в скрипт, чтобы выполнить любое переименование, которое вам требуется, как в:

ls|env LC_ALL=C grep '[^!-~]'|while l=`line`; do ... ; mv "$l" "$n" ; done

Пропущенный код предназначен для формулировки любого нового имени $n вам требуется. Если у вас нет line , вы можете использовать вместо while read l , хотя это не будет правильно работать с именами файлов с пробелами в начале или в конце.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .