Рекурсивное переименование папок в @eaDir

В ksh93, bash или zsh:

numeronym() {
  (( ${#1} > 2 )) || return
  printf '%s%d%s\n' "${1:0:1}" "$(( ${#1} - 2 ))" "${1: -1:1}"
}

Это работает только с первым (параметром )путем печати первой буквы, (количества символов минус 2 )и последней буквы.

0
18.09.2020, 10:50
1 ответ

Для любопытных, что скорее всего происходит :команда

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 {} +
0
18.03.2021, 23:04

Теги

Похожие вопросы