Назад | Перейти на главную страницу

Пакетное переименование каталогов с помощью регулярного выражения через командную строку в Linux

У меня есть папка на сервере, содержащая каталоги, которые создаются ежедневно и называются по дате, например:

07-06-14
08-06-14
09-06-14

и т.п.

В какой-то момент я решил, что предпочтительное именование будет в следующем формате: 2014-06-07 И новые папки создаются в этом формате. Итак, теперь папка содержит как каталоги в старом формате, так и в новом.

Как пакетно переименовать каталоги из старого формата в новый?

Я пробовал это: rename -n 's/(\d{2})\-(\d{2})\-(\d{2})\20$3-$2-$1//' *

Но выдает ошибки: Use of uninitialized value $2 in regexp compilation at (eval 1) line 1

Ваше регулярное выражение не работает, я думаю, вы имели в виду что-то вроде этого:

's/(\d{2})-(\d{2})-(\d{2})/20$3-$2-$1/'

то есть дефисы не нужно экранировать, а вторая косая черта неуместна.

Обратите внимание, что с помощью этой замены вы также переименуете файлы с новой схемой именования. Вероятно, вы захотите привязать регулярное выражение. Примерно так должно работать:

rename -n 's/^(\d{2})-(\d{2})-(\d{2})$/20$3-$2-$1/' *

Я бы пошел по следующему пути:

for i in `find . -name "[0-9][0-9]-[0-9][0-9]-[0-9][0-9]"`; do
  NEWNAME=`echo $i | sed 's/\([0-9][0-9]\)-\([0-9][0-9]\)-\([0-9][0-9]\)/20\3-\2-\1/'`
  echo $NEWNAME
done

Теперь, когда вы удовлетворены результатом, просто замените «echo $ NEWNAME» на «mv $ i $ NEWNAME».

Конечно, это не безошибочное решение, например, если есть каталог с именем 30-05-14 и 2014-05-30, это не переименует текущий каталог, а переместит его в 2014-05-30 /. Поскольку вы сказали, что в какой-то момент переключили схемы, я полагаю, этого не произойдет (например, у вас нет каталога на определенную дату в обоих форматах).

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