Как из папки раскидать все файлы по подпапкам по 10 шт?

Есть папка, в ней много файлов .mp4 Как используя батник (не powershell) внутри папки создать много подпапок и раскидать по подпапкам эти файлы, чтоб в каждой подпапке было не более 10 файлов.

Естественно, что если в папке у нас будет не кратное кол-во .mp4 файлов то в последней подпапке будет закинуто меньше чем 10 файлов.


Ответы (1 шт):

Автор решения: Zt.

script.sh

#!/usr/bin/env bash

DIR="${0%/*}"

# значения по умолчанию
dir_in="$DIR/papka_A"
dir_out="$DIR/papka_B"
subdir_name="subpapka"
ext="mp4"
number=10

while [[ "$1" =~ ^- && ! "$1" == "--" ]]; do case $1 in
  --dir_in      ) shift; dir_in=$1;;
  --dir_out     ) shift; dir_out=$1;;
  --ext         ) shift; ext=$1;;
  --number | -n ) shift; number=$1;;
  --subdir_name ) shift; subdir_name=$1;;
esac; shift; done
if [[ "$1" == '--' ]]; then shift; fi

mkdir -p "$dir_out"

i=0
while [[ $(ls "$dir_in"/* | grep ".$ext$") != "" ]]; do
    subdir="$dir_out"/"$subdir_name"_$(printf "%03d" $i)
    mkdir -p "$subdir"
    mv $(ls "$dir_in"/* | grep ".$ext$" | head -n $number) "$subdir"
    i=$[i+1]
done

exit

Для большего понимания рассмотрим пример

подготовить полигон можно таким однострочником на баш

mkdir -p papka_A && touch papka_A/file_{01..99}.mp4 && touch papka_A/file_{a..z}.xxx

здесь мы создали папку papka_A и 99 файлов в ней с расширением mp4, а также для фона добавили других файлов

получим примерно следующее

$ tree papka_A
papka_A
├── file_01.mp4
├── file_02.mp4
...
├── file_98.mp4
└── file_99.mp4
├── file_a.xxx
├── file_b.xxx
...
├── file_y.xxx
└── file_z.xxx

делаем наш скрипт исполняемым и запускаем его

chmod +x script.sh
./script.sh --dir_in papka_A --dir_out papka_B --ext mp4 -n 10 --subdir_name subpapka

где при желании указываем свои параметры. После отработки скрипта в итоге получим:

$ tree papka_B
papka_B
├── subpapka_000
│   ├── file_01.mp4
│   ├── file_02.mp4
│   ├── file_03.mp4
│   ├── file_04.mp4
│   ├── file_05.mp4
│   ├── file_06.mp4
│   ├── file_07.mp4
│   ├── file_08.mp4
│   ├── file_09.mp4
│   └── file_10.mp4
├── subpapka_001
...
└── subpapka_009
    ├── file_91.mp4
    ├── file_92.mp4
    ├── file_93.mp4
    ├── file_94.mp4
    ├── file_95.mp4
    ├── file_96.mp4
    ├── file_97.mp4
    ├── file_98.mp4
    └── file_99.mp4

а в папке papka_A останутся тока файлы без расширения mp4.

$ tree papka_A
papka_A
├── file_a.xxx
├── file_b.xxx
├── file_c.xxx
...
└── file_z.xxx
→ Ссылка