2

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

  • имя_базовой_папки
    • 2010-01-01
      • несколько файлов и иногда подкаталогов
    • 2010-01-02
    • ...
    • ...
    • 2014-12-15

Так как это стало слишком большим для комфорта, я решил немного передвигаться и в итоге получил следующее:

  • имя_базовой_папки
    • 2010
      • 01
        • 2010-01-01
        • 2010-01-02
        • ...
        • 2010-01-31
      • 02
        • 2010-02-01
        • 2010-02-02
        • ...
        • 2010-02-28
      • 03
      • ...
    • 2011
    • ...
    • 2014

Так что, чтобы получить сегодняшние данные, я бы посмотрел в basedir/2014/12/2014-12-15/

Я хотел бы переименовать все подкаталоги с полной датой так, чтобы в них указывался только день месяца. Сегодняшние данные будут размещены в basedir/2014/12/15/ .

Каков простой способ достичь этого?


После некоторого осмотра я создал регулярное выражение для find которое специально дает мне каталоги, которые я ищу, тем самым уменьшая количество путаницы.

find . -type d -regextype posix-extended -regex '.*/(20[0-9]{2})/(0[1-9]|1[0-2])/\1-\2-(0[1-9]|[1-2][0-9]|3[0-1])'

1 ответ1

3

Вот одна строка:

find -mindepth 3 -maxdepth 3 -type d | while read -r name; do
  mv -v "$name" "${name/????-??-}"; done

быть исполненным в basedir .

Разрыв строки только для удобочитаемости, но технически это однострочный.

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

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

Часть "${name/????-??-}" специфична для bash. Это может не работать на других оболочках. Это называется поиск и замена в расширении параметров.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .