Пакетное переименование файлов, создание подпапок и перемещение файлов по шаблону

У меня есть 500000 файлов в папке, и я хочу переместить их во вложенные папки. Эти подпапки должны быть созданы автоматически.

Шаблон - {префикс}-{дата}T{время}-{суффикс}.

Структура папок должна выглядеть как {дата}/{время}/{суффикс}.

Мне удалось удалить префикс с помощью bash-скрипта:

    #!/bin/bash
    for f in prefix-* ; do
        mv "$f" "${f/prefix-}"
    done
0
22.11.2016, 13:06
1 ответ

Предполагая, что в именах файлов никогда не будет тире - или прописных T, вы можете построить следующий цикл bash:

for f in *
do
   date=$(tmp=${f#*-};echo ${tmp%T*})
   time=$(tmp=${f#*T};echo ${tmp%-*})
   suffix=${f##*-}
   mkdir -p ${date}/${time}/${suffix}
   mv $f ${date}/${time}/${suffix}/
done

Это основной синтаксис расширения параметров bash, согласно man-странице:

 ${параметр#слово}
 ${параметр#слово}
 Удаление совпадающего префиксного шаблона. Слово расширяется для получения шаблона так же, как и при расширении имени пути. Если паттерн
 совпадает с началом значения параметра, то результатом расширения будет расширенное значение парамет-
 eter с удалением самого короткого (в случае ``#'') или самого длинного (в случае ``##'') шаблона.
 Если параметр равен @ или *, операция удаления шаблона применяется к каждому позиционному параметру по очереди, и расширением является результирующий список.
 ется результирующий список. Если параметр представляет собой переменную массива, подзаписанную @ или *, операция удаления шаблона
 применяется к каждому члену массива по очереди, а расширением является результирующий список.

 ${параметр%слово}
 ${параметр%%слово}
 Удаление совпадающего суффиксального шаблона. Слово расширяется для получения шаблона так же, как и при расширении имени пути. Если паттерн
 шаблон совпадает с трейлинг-частью расширенного значения параметра, то результатом расширения будет расширенное значение параметра
 значение параметра с самым коротким совпадающим шаблоном (случай ``%'') или самым длинным совпадающим шаблоном (случай ``%%'').
 удалено. Если параметр равен @ или *, операция удаления шаблона применяется к каждому позиционному параметру по очереди,
 и расширением является результирующий список. Если параметр - переменная массива, подзаписанная @ или *, операция удаления шаблона применяется к каждому члену массива.
 применяется к каждому члену массива по очереди, а расширением является результирующий список.

Я использовал временную переменную в качестве заполнителя, поскольку bash не позволяет прямое вложение операции расширения.

date=$(tmp=${f#*-};echo ${tmp%T*})
$f - имя текущего файла
tmp={f#*-} : удалить все до ПЕРВОГО -
В данный момент tmp содержит {дата}T{время}-{суффикс}
${tmp%T*} : удалить все после T (включительно)

2
28.01.2020, 02:34

Теги

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