У меня есть список файлов в каталоге, но некоторые из них имеют странные символы в имени. Как я могу переименовать только эти файлы, чтобы удалить эти символы?
Компьютерная ОС Red Hat, кодировка UTF-8.
У меня есть список файлов в каталоге, но некоторые из них имеют странные символы в имени. Как я могу переименовать только эти файлы, чтобы удалить эти символы?
Компьютерная ОС Red Hat, кодировка UTF-8.
Попробуйте детокс. Со страницы руководства:
название
Детокс - очистить имена файлов
конспект
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
.
Если вы не можете использовать 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
, хотя это не будет правильно работать с именами файлов с пробелами в начале или в конце.