bash Linux - массовое переименование папок - PullRequest
1 голос
/ 12 января 2010

На нашем файловом сервере Linux (RedHat Enterprise) у нас есть несколько папок, которые нам нужно переименовать, чтобы в них работали клиенты. Старый формат папок (те, которые необходимо изменить) был clientcode_jobnumberjobname. Новый формат clientcode_jobnumber_jobname. Нам в основном нужно изменить старые имена папок, добавив дополнительное подчеркивание к имени папки между jobnumber и jobname. У нас также есть все новые структуры папок, которые создаются для отображения в новом формате, поэтому их не нужно менять. Номер задания всегда состоит из 1 буквы, за которой следуют 4 цифры. Код клиента состоит из 3–4 букв в зависимости от клиента. Название работы отличается для каждой работы. Все папки расположены в clients/clientname/jobs/clientcode/"folder that needs to be renamed" (просто пример того, как глубоко сценарий должен войти в структуру). Это нужно будет сделать для каждого clientcode под каждым клиентом. Как мне настроить скрипт для этого? Любая помощь будет высоко оценена. У нас есть тысячи этих папок, которые нам нужно переименовать.

Ответы [ 5 ]

7 голосов
/ 12 января 2010

Есть несколько команд, которые действуют как sed для имен файлов; попробуйте mmv (или perl-вариант rename, он же prename или rename.PL, которого вы не найдете в RHEL).

В качестве бонуса у обоих есть опция -n (бездействие), так что вы можете проверить, что вы собираетесь делать, не собирается что-то стучать или терять информацию.

0 голосов
/ 13 января 2010
find /path/clients -type d -name "*_?[0-9][0-9][0-9][0-9]*" | while IFS= read -r DIR
do
    dir=${DIR##*/}
    base=${DIR%/*}
    IFS="_"
    set -- $dir
    front=$1
    back=$2
    jobname=${back#?????}
    jobnum=${back%$jobname}
    newname="${front}_${jobnum}_${jobname}"
    echo mv "$DIR" "$base/$newname"
done
0 голосов
/ 12 января 2010

, так как вы говорите, что формат имени очень структурирован, и все находятся под одним родителем (как прямые, так и косвенные дети ... не уверены в том, что вы упомянули), я бы предложил следующее:

Создайте регулярное выражение для имени папки и напишите небольшой сценарий perl, который бы сопоставил имя содержимого целевой папки (в которой у вас есть папки, которые нужно переименовать) с регулярным выражением. как только у вас есть совпадения, переименуйте папку с новым именем. Perl делает все это легко.

В случае, если вы решите использовать этот подход, и на всякий случай вы не знаете Perl и не знаете, с чего начать, и при условии, что вы заинтересованы в некотором обучении по пути, я бы посоветовал вам прочитать книгу «Минимальный Perl "... быстрый и интересный способ выучить чудовищный язык и использовать его для вещей, похожих на то, что вам нужно сейчас.

Надеюсь, это поможет.

0 голосов
/ 12 января 2010

возможно, это только я, но я не совсем понимаю, как выглядит структура каталогов, не могли бы вы привести пример в некоторых тегах кода.

И, возможно, это должно быть на serverfault.com (но я думаю, сценарий #! / Bin / sh считается программированием)

РЕДАКТИРОВАТЬ: Нуфал Ибрагим, сопротивляясь? Речь идет об использовании способа, который работает во всех POSIX-совместимых версиях, или Linux, возможно, я уже стар, но машины Solaris, которые у меня есть, не включают rename или mmv. Следовательно, такое решение невозможно.

0 голосов
/ 12 января 2010
for entry in * ; do
  if [ ! -d "$entry" ] ; then
    continue
  fi
  jobname="${entry##*_?????}"
  dirbase="${entry%$jobname}"
  if [ -z "$dirbase" -o -z "$jobname" ] ; then
    echo "Error with '$entry'"
    continue
  fi
  mv "$entry" "${dirbase}_$jobname"
done
...