У меня есть каталог с 6 подкаталогами. В каждом подкаталоге также есть переменное количество подкаталогов. Эти последние каталоги имеют переменные номера файлов *. Jpg
. Файлы jpg именуются в виде 0000.jpg
, 0001.jpg
и так далее.
Мне интересно получить последние 100 * .jpg
файлов (все каталоги содержат> 100 файлов) и сохранить их в отдельных каталогах с такой же структурой, как и исходные каталоги.
Как лучше всего это сделать?
В родителе с этими 6 подкаталогами:
mkdir ../newdirs
Затем:
for d in */*; do mkdir -p ../newdirs/"$d"; i=0; j=$(stat "$d"/* --printf "%i\n" | wc -l); for f in "$d"/*; do [[ -f "$f" ]] && (( (j - ++i) < 100 )) && echo mv -v -- "$f" ../newdirs/"$d"; done; done
Удалить echo
после тестирования для фактического перемещения файлов.
Больше четко:
for d in */*; do
mkdir -p ../newdirs/"$d"
i=0
j=$(stat "$d"/* --printf "%i\n" | wc -l)
for f in "$d"/*; do
[[ -f "$f" ]] &&
(( (j - ++i) < 100 )) &&
echo mv -v -- "$f" ../newdirs/"$d"
done
done
mkdir ../newdirs
сделайте новый каталог для перемещенных файлов на том же уровне как текущий (т.е. в родителе ..
из обоих) for d in */*; do
для каждого подподкаталога... mkdir -p ../newdirs/"$d"
сделайте каталог в параллельной структуре, с помощью -p
создать родительские каталоги по мере необходимости и i=0
установите переменную на 0 для подсчета повторенийj=$(stat "$d"/* --printf "%i\n" | wc -l)
считайте файлы в подподкаталоге и присвойте этот номер j
for f in "$d"/*; do
для всего содержания подподкаталогов[[ -f "$f" ]] &&
если это - файл (( (j - ++i) < 100 )) &&
и если количество файлов в каталоге минус количество раз, цикл был выполнен, является меньше чем 100, то... mv -v -- "$f" ../newdirs/"$d"
переместите файл в соответствующий каталог в новой структуре.for
выполняет итерации по файлам заказанным способом, таким образом, этот метод даст последние 100 файлов, как перечислено численно.
Можно корректироваться ../newdirs
к пути Вы хотите.