У меня есть папка на сервере, содержащая каталоги, которые создаются ежедневно и называются по дате, например:
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 /. Поскольку вы сказали, что в какой-то момент переключили схемы, я полагаю, этого не произойдет (например, у вас нет каталога на определенную дату в обоих форматах).
Также это решение, вероятно, не будет работать, если у вас есть пробелы в именах каталогов.