Убедитесь, что вы используете один из вариантов rename
на основе perl
-, иногда называемый prename
, а не вариант из util-linux
(, иногда называемыйrename.ul
).
Вариант из util-linux
намного более ограничен (, несмотря на то, что он намного новее ), использует другой синтаксис, может заменять только фиксированные строки и не может заменять все вхождения строки.
Здесь я бы использовал варианты perl rename
, убедитесь, что вы конвертируете символы новой строки только в именах файлов,а не компоненты каталога, ведущие к ним, и используйте -depth
для обработки листьев перед ветвями.
perl
распознает \n
как символ новой строки, поэтому вам не нужно использовать $'...'
в качестве аргумента кода (, хотя это нормально, если вы делаете вопреки тому, что я изначально думал ).
find. -depth -name $'*\n*' -exec rename '
s{[^/]*\z}{$& =~ y/\n/ /r}e' '{}' +
Или используйте -execdir
, если доступно (, хотя это будет запускать по крайней мере один rename
в каталоге с файлами с \n
в пределах):
find. -depth -name $'*\n*' -execdir rename 'y/\n/ /' {} +
Или вы можете использовать zsh
'szmv
:
autoload zmv
NL=$'\n'
zmv "(**/)(*$NL*)(#qD)" '$1${2//$NL/ }'
(, который, в отличие от подходов, основанных на find
-, будет по-прежнему работать, даже если имена файлов содержат последовательности байтов, которые не образуют допустимых символов. Он также отключится без каких-либо действий, если обнаружит конфликт ).
Если вы хотите напечатать æ в нижнем регистре Unicode, то есть u00E6, вы можете использовать это:
$ printf '\u00E6\n'
æ
Итак, если ваш файл выглядит так:
$ printf 'foobarbaz\u00E6bar\u00E6baz bar something else whohooo!\n'
foobarbazæbaræbaz bar something else whohooo!
Вы можете использовать такой столбец:
$ printf 'foobarbaz\u00E6bar\u00E6baz bar something else whohooo!\n' |
column -ts$'\u00E6' -o "::::::::"
foobarbaz::::::::bar::::::::baz bar something else whohooo!
Обратите внимание на escape-формат ANSI($'characterCode'
). Я использовал -o "::::::::"
, чтобы вы могли легко увидеть столбцы.