У меня есть 500000 файлов в папке, и я хочу переместить их во вложенные папки. Эти подпапки должны быть созданы автоматически.
Шаблон - {префикс}-{дата}T{время}-{суффикс}
.
Структура папок должна выглядеть как {дата}/{время}/{суффикс}
.
Мне удалось удалить префикс с помощью bash-скрипта:
#!/bin/bash
for f in prefix-* ; do
mv "$f" "${f/prefix-}"
done
Предполагая, что в именах файлов никогда не будет тире -
или прописных 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
(включительно)