Автор Тема: Как правильно переименовать каталоги?  (Прочитано 2119 раз)

Оффлайн goshka

  • Участник
  • *
  • Сообщений: 114
Нужно рекурсивно переименовать все каталоги с именем v3_0 на current
find . -name 'v3_0' -exec mv {} $(echo {} | sed 's/v3_0/current/g') \;

mv: невозможно перенести «./packages/io/fileio/v3_0» в свой собственный подкаталог, «./packages/io/fileio/v3_0/v3_0»

Немного не понимаю: как написать выражение правильно?

Спасибо.

Оффлайн bormant

  • Участник
  • *
  • Сообщений: 358
find . -name 'v3_0' -exec mv '{}' $(echo '{}' | sed 's/v3_0/current/g') \;
Так имелось в виду? $(echo '{}' | sed ...) не отработает, как ожидалось.

Не лучше было бы просто создать ссылки ./v3_0 -> ./current ?
« Последнее редактирование: 08.12.2011 22:54:29 от bormant »

Оффлайн goshka

  • Участник
  • *
  • Сообщений: 114
Да, sed не отрабатывает, как ожидалось.
Как я понял, он должен заменить подстроку "v_30" на подстроку "current"
Что я делаю не так?
ln не лучше.
Это необходимо, только чтобы сделать diff 2-х проектов.
« Последнее редактирование: 09.12.2011 09:41:56 от goshka »

Онлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 20 189
    • Домашняя страница
Смотрите, там будут подводные камни с рекурсией: нужно сначала переименовывать самые глубокие проекты, затем уровень выше. Иначе в пути v3_0/src/v3_0/files будет произведено первое переименование, а во втором путь не будет найден. Поэтому:
1. Составим список каталогов (а не просто имён) на переименование и отсортируем его в обратном порядке:
find . \( -type d -a -name 'v3_0' \) | sort -r2. Имея список, передаём его в цикл переименования (при этом переименовываем с конца):
find . \( -type d -a -name 'v3_0' \) | sort -r | while read d;do mv "$d" "${d/%v3_0/current}";done
Андрей Черепанов (cas@)

Оффлайн black

  • alt linux team
  • ***
  • Сообщений: 460
Нужно рекурсивно переименовать все каталоги с именем v3_0 на current
find . -name 'v3_0' -exec mv {} $(echo {} | sed 's/v3_0/current/g') \;

mv: невозможно перенести «./packages/io/fileio/v3_0» в свой собственный подкаталог, «./packages/io/fileio/v3_0/v3_0»

Немного не понимаю: как написать выражение правильно?

Спасибо.
боюсь вам в одну строчку не удастся это сделать. В find "{}" можно только один раз использовать.

Оффлайн goshka

  • Участник
  • *
  • Сообщений: 114
Смотрите, там будут подводные камни с рекурсией: нужно сначала переименовывать самые глубокие проекты, затем уровень выше. Иначе в пути v3_0/src/v3_0/files будет произведено первое переименование, а во втором путь не будет найден. Поэтому:
1. Составим список каталогов (а не просто имён) на переименование и отсортируем его в обратном порядке:
find . \( -type d -a -name 'v3_0' \) | sort -r2. Имея список, передаём его в цикл переименования (при этом переименовываем с конца):
find . \( -type d -a -name 'v3_0' \) | sort -r | while read d;do mv "$d" "${d/%v3_0/current}";done

Спасибо! Все переимановалось!  :D

В моем случае  м.б. не очень важны грабли с рекурсией. Я могу запускать скрипт несколько раз для достижения результата.

Онлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 20 189
    • Домашняя страница
В моем случае  м.б. не очень важны грабли с рекурсией. Я могу запускать скрипт несколько раз для достижения результата.
Привыкайте учитывать все детали. Например, наличие файлов с такими именами и прочие моменты. Это позволит избежать «подземного стука». :)
Андрей Черепанов (cas@)