Регулярное выражение для переименования папки с "dd.mm.yy" на "yy.mm.dd"?

У меня уже была эта проблема пару раз. В простых случаях было достаточно получить доступ к загрузчику grub boot -, нажав ESC , а затем выбрав образ Ubuntu.

На этот раз мне пришлось еще немного повозиться.Мои шаги по исправлению были:

  1. Нажатие ESC при запуске -до открытия загрузки -загрузчика
  2. Выбор образа восстановления для загрузки (, который был успешно запущен)
  3. Вход в систему как rootв терминале
  4. Запуск fsck /dev/sda1(, в то время как sda1является моим загрузочным креплением)
  5. Пусть fsckисправит проблему (она найдет ее для меня)
  6. Перезагрузка -> Готово:)

Я знаю, что уже немного поздно, но, возможно, это поможет кому-то еще

2
19.10.2019, 08:37
6 ответов

Очень простой способ сделать это, так как папки уже созданы.

ls -1d */|cut -f1 -d/ |awk -F"." '{print "mv " $0 " " $3"."$2"."$1"/"}' | bash
1
27.01.2020, 21:49

В вашем вопросе нужно немного больше информации, поэтому я предполагаю:

  • под всеми папками вы имеете в виду все папки в текущем каталоге
  • упомянув регулярное выражение, вы не упомянули ОС, поэтому я работаю на основании того, что ваша renameверсия их поддерживает
rename 's/^([0-9]{2})\.([0-9]{2})\.([0-9]{2})\//$3.$2.$1/' */

Если у вас нет renameили он есть и он не поддерживает регулярное выражение, это более переносимый подход (, хотя и менее элегантный):

find. -mindepth 1 -maxdepth 1 -type d \
  | sed 's ^./  ' \
  | grep -E "^([0-9]{2}\.){2}[0-9]{2}$" \
  | while IFS=. read dd mm yy ; do mv $dd.$mm.$yy $yy.$mm.$dd ; done
3
27.01.2020, 21:49

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

for dir in */; do echo mv $dir $(LC_ALL=C busybox date -uD '%d.%m.%Y' -d "$dir" "+%Y.%m.%d") ; done

(вдохновлено Принудительное отображение даты в формате День/Месяц/Год .)
Я включил echoдля режима «предварительного просмотра».

2
27.01.2020, 21:49

Решение bashпо переименованию каталогов в вашем текущем каталоге:

for f in [0-3][0-9].[01][0-9].[0-9][0-9]; do
  [ -d "$f" ] && mv -v "$f" "${f:6}.${f:3:2}.${f:0:2}"
done
5
27.01.2020, 21:49

Это длиннее одного -лайнера, но это не делает никаких предположений о дате:

$ mkdir 12.12.12 01.02.99

$ perl -MTime::Piece -Mautodie -E '
  opendir my $dh, ".";
  while (my $f = readdir $dh) {
    if (-d $f and $f =~ /^\d\d.\d\d.\d\d$/) {
      my $t = Time::Piece->strptime($f, "%d.%m.%y");
      rename $f, $t->ymd;
    }
  }
'

$ ls
1999-02-01/  2012-12-12/
2
27.01.2020, 21:49

Я знаю, что это некрасиво (и в некоторых ситуациях не работает... )но...

reg='^(..)\.(..)\.(..)/'
for a in */ ; do
  [[ $a =~ $reg ]] && mv $a ${BASH_REMATCH[3]}.${BASH_REMATCH[2]}.${BASH_REMATCH[1]}
done
0
27.01.2020, 21:49

Теги

Похожие вопросы