LINUX.ORG.RU

Массовое переименование каталогов

 , ,


0

1

Приветствую!

Необходимо переместить файлы с боевого почтового сервера на новый. Формат на боевом:

/mail/vmail/a/a/a.antonov-2019.01.01/*

/mail/vmail/a/p/a.petrov-2019.01.01/*

На новом сервере структура должна быть такая:

/mail/vmail/a.antonov-2019.01.01/*

/mail/vmail/a.petrov-2019.01.01/*

Так вот: с перемещением справился, а как массово переименовать каталоги, убрав всё, после имен?

P.S. Не самый сильный линуксоид, но кое что понимаю. Примеры скриптов хотелось бы увидеть, для понимания :)



Последнее исправление: moskit1976 (всего исправлений: 1)

Если структура всегда БУКВА/БУКВА/ИМЯ и директорий немного

mkdir /var/vmail_new
mv /var/vmail/?/?/* /var/vmail_new
mv /var/vmail /var/vmail_old
mv /var/vmail_new /var/vmail

Если много, то с find.

tiandrey ★★★★★
()
Последнее исправление: tiandrey (всего исправлений: 1)
Ответ на: комментарий от moskit1976

Если bash ругнётся на слишком длинную командную строку, тогда вариант с find

mkdir /var/vmail_new
find /var/vmail -mindepth 3 -maxdepth 3 -type d -exec mv -v {} /var/vmail_new \;
mv /var/vmail /var/vmail_old
mv /var/vmail_new /var/vmail
tiandrey ★★★★★
()
Ответ на: комментарий от tiandrey

Ой, сорри. Немного ошибся :)

После переименования должно быть:

/mail/vmail/a.antonov/* /mail/vmail/a.petrov/*

А команда find /var/vmail -mindepth 3 -maxdepth 3 -type d -exec mv -v {} /var/vmail_new ; не прошла:

find: missing argument to `-exec’

Но все равно, спасибо большое. Буду ковырять.

moskit1976
() автор топика
Ответ на: комментарий от moskit1976
dirname=/mail/vmail/a.antonov-2019.01.01
echo ${dirname/-*/}
/mail/vmail/a.antonov
anonymous
()
Ответ на: комментарий от tiandrey

Скопировал всё такой командой (там есть ещё немного вложений: /mail/vmail/b/u/h/buhi-2019.01.01/*

cp -r /mail/vmail///* /mail/vmail && cp -r /mail/vmail//// /mail/vmail/

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

moskit1976
() автор топика
Ответ на: комментарий от moskit1976

Если полностью, то

ls
a.antonov-2019.02.01  i.sidorod-2019.02.01  v.petrov-2019.02.01

find -mindepth 1 -maxdepth 1 -type d -exec bash -c 'dirname='{}'; echo mv "$dirname" "${dirname/-*}"' \;
mv ./a.antonov-2019.02.01 ./a.antonov
mv ./i.sidorod-2019.02.01 ./i.sidorod
mv ./v.petrov-2019.02.01 ./v.petrov

echo для проверки, потом уберешь.

anonymous
()
Ответ на: комментарий от tiandrey

Бэкслеш перед точкой с запятой был не просто так.

Невнимательность, сорри :)

moskit1976
() автор топика

Это же не переименование, а просто перемещение из дерева /a/b в корень этого дерева.

imul ★★★★★
()
Ответ на: комментарий от imul

Надо убрать дату (числа) из названий директорий.

сейчас скину рабочий скрипт.

Спасибо анонимусу и tiandrey ★★★★★ - дали толчок.

moskit1976
() автор топика
Ответ на: комментарий от imul

Задача выполнена. Коряво, но насколько мозгов хватило. Скоро будет проверка на новом боевом почтовом сервере:


#!/bin/bash

 cd /backup/test

 find -mindepth 3 -maxdepth 4 -type d -exec bash -c 'dirname='{}'; mv "$dirname" "${dirname/-*}"' \;

 cp -r /backup/test/*/*/* /backup/2 && cp -r /backup/test/*/*/*/* /backup/2

 rm -r /backup/2/[a-z] && rm -r /backup/2/Maildir

Все пути тестовые, но реальные. В коде ничего не менял.

Ещё раз спасибо за помощь @tiandrey ★★★★★ и всем, всем, всем.

moskit1976
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.