Если вы не против того, чтобы все было перемещено отдельно:
#! /bin/bash
for ((i = 1; ; i++))
do
mkdir -p target-$i
for j in $(seq $((i*7 - 6)) $((i*7)))
do
mv -t "target-$i" "source/image$j.tiff" || exit 1
done
done
Или, более кратким:
find source -type f -name 'image*.tiff' -print0 | \
sort -z --version-sort | \
xargs -0n7 bash -c 'TARGET=target-$((${1//[^0-9]/} / 7 + 1)); \
echo mkdir -p "$TARGET"; \
echo mv -t "$TARGET" "$@"' move-7
Объяснение:
-print0 печатает имена файлов, разделенные символом NUL (\0). Это самый безопасный способ передачи имен файлов в качестве вывода в другие команды. sort с -z ищет вход с нулевым разграничением, а сортировка версии позволяет безопасно сортировать номера переменной длины, так что image2.tiff до image119.tiff xargs может ограничить количество аргументов, применяемых к каждой команде с -n, поэтому здесь мы используем -n7. [F13] для ввода с нулевым ограничением. Мы извлекаем фактор числа первого аргумента $((${1//[^0-9]/} / 7 + 1)) - ${1//[^0-9]/} удаляет все в аргументе, который не является числом. Целочисленное деление гарантирует, что мы получим коэффициент. Это должно быть быстрее, так как мы выполняем ровно число mv s.Осмотрите полученные команды, и если они выглядят нормально, запустите его снова после удаления echo s.
KasiyA имеет интересную модификацию.
]интересная модификация приносит rename на ум. Во-первых, сделайте все каталоги:
FILES=(source/image*.tiff)
COUNT=${#FILES[@]}
DIR_NUM=$((COUNT / 7 + 1))
seq 1 $DIR_NUM | xargs bash -c 'mkdir -p "${@/#/target-}"'
rename -n 's;source/image(\d+)\.tiff$;"target-".int($1 / 7 - 1)."/image".$1.".tiff";e' source/image*.tiff
На самом деле мы могли бы применить первые четыре строки ко всем решениям здесь и пропустить повторную mkdir -p.