В ksh93, bash или zsh:
numeronym() {
(( ${#1} > 2 )) || return
printf '%s%d%s\n' "${1:0:1}" "$(( ${#1} - 2 ))" "${1: -1:1}"
}
Это работает только с первым (параметром )путем печати первой буквы, (количества символов минус 2 )и последней буквы.
Для любопытных, что скорее всего происходит :команда
find. -type d -name 'eaDir_tmp' -exec mv '{}' @eaDir \;
перемещает каждый найденный каталог ./whatever/eaDir_tmp
(, то есть компонент eaDir_tmp
), в текущий рабочий каталог:./whatever/eaDir_tmp
→ ./@eaDir
. (Поскольку @eaDir
рассматривается mv
как компонент пути относительно текущего рабочего каталога ).
В первый раз создается ./@eaDir
, если он еще не существует.
Второй найденный ./whatever/eaDir_tmp
перемещается в ./@eaDir
, потому что целевой каталог, указанный в mv
(@eaDir
), существует в этот момент:./whatever/eaDir_tmp
→ ./@eaDir/eaDir_tmp
.
Дальнейшие найденные ./subfolder/eaDir_tmp
также перемещаются в ./@eaDir
, и этот шаг не выполняется, поскольку ./@eaDir/eaDir_tmp
уже существует и не является пустым.
Что можно сделать :, если ваша find
реализация поддерживает действие -execdir
:
find. -depth -type d -name 'eaDir_tmp' -execdir mv '{}' @eaDir \;
-depth
на самом деле требуется только в случае вложенных каталогов eaDir_tmp
(, например../whatever/eaDir_tmp/whatever/eaDir_tmp
).
В отличие от -exec
, -execdir
запускает указанную команду из каталога, содержащего соответствующий файл (, а не из find
текущего рабочего каталога ).
Если ваш find
не поддерживает стандарт, отличный от --execdir
:
find. -depth -type d -name 'eaDir_tmp' \
-exec sh -c 'mv "$1" "${1%/*}/@eaDir"' mysh {} \;
Или, чтобы не запускать оболочку для каждого найденного каталога:
find. -depth -type d -name 'eaDir_tmp' -exec sh -c '
for dir
do
mv "$dir" "${dir%/*}/@eaDir"
done' mysh {} +