Возможно, использовать y //
(встроенная команда tr в sed) вместо s ///
:
$ echo clayii | sed -e '/clayii/ y/clayk/kieio/'
kieiii
Обратите внимание, что команда y //
будет по-прежнему применяться ко всей строке, а не только к подходящее слово.
Добавление 1
к именам всех файлов, имена которых изначально заканчивались на.foo
:
find. -type f -name '*.foo' -exec mv -i {} {}1 ';'
Использование вами rename
может работать не везде. Другой способ добиться этого — использовать find
, mv
и некоторую замену bash.
find. -name '*.foo' -exec bash -c 'mv "$0" "${0%.foo}.foo1"' "{}" \;
Несколько замечаний:
Я использую -exec
, а не -execdir
. Последний эффективно cd
указывает на каталог совпадающего файла (, что не совсем то, что вам нужно, потому что тогда путь к файлу --, который будет относиться к .
--, больше не будет правильным ). ]. Вам нужен только -exec
, который будет запускать данную команду для каждого файла, соответствующего -name '*.foo'
(, заменяя {}
путем к совпавшему файлу ).
"${0%.foo}"
удаляет расширение .foo
, поэтому, если $0
равно "hello.foo"
, тогда "${0%.foo}"
заканчивается как "hello"
. Затем добавление .foo1
в конец просто добавляет это, поэтому "${0%.foo}.foo1"
равно "hello.foo1"
.