Предполагая, что в именах файлов никогда не будет тире -
или прописных 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
(включительно)
Как отметил в комментарии @jordanm, гораздо безопаснее создать символическую ссылку на новое место в существующем разделе, чем пытаться изменить размер разделов, сохранив их текущее содержимое.
В вашей ситуации это может быть достигнуто с помощью чего-то вроде:
cd /var
sudo mv -i www /home/
sudo ln -s /home/www .
(в качестве примечания: обычно рекомендуется включать флаг -i
в mv
в чтобы получить предупреждающее сообщение, если вы собираетесь что-то перезаписать, особенно если вы вводите mv
с помощью sudo
)