Рекурсивная замена всех точек в именах каталогов и подкаталогов пробелами

Я должен был это сделать:

systemtcl disable *dm

где *— это gили kможет быть x.

0
31.10.2019, 07:02
1 ответ

Использованиеfind:

find. -mindepth 1 -type d -name "*.*" -exec bash -c '
  for ((i=$#;i>0;i--)); do
    dir=${!i}
    newdir=$(dirname "$dir")/$(basename "$dir" | tr -s "." " ")
    if [ -e "$newdir" ]; then
      echo "skipping \"$dir\", \"$newdir\" already exists" >&2 
    else
      mv "$dir" "$newdir"
    fi
  done
' bash {} +

Это рекурсивно находит все имена каталогов с шаблоном *.*в текущем каталоге, пропуская текущий каталог с -mindepth 1. Список найденных каталогов передается с -execв скрипт bash, где его аргументы обрабатываются в обратном порядке в цикле for -(подкаталоги с более глубоким уровнем идут первыми ).

Новое имя каталога создается из его dirnameи basename. Последний изменен с помощью tr, где несколько точек заменяются одним символом пробела (удалите опцию -s, если вы хотите заменить несколько точек несколькими пробелами ). Затем напечатайте сообщение об ошибке, если новое имя каталога уже существует, или переместите его.

3
28.01.2020, 02:29

Теги

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