Как рекурсивно переместить пакеты по 20 файлов в пронумерованные папки из папки с 1000 файлами

Как рекурсивно переместить пакеты по 20 файлов в пронумерованные папки из папки с 1000 файлами

У меня есть папка, полная 1000 (или более) файлов. Я хочу иметь скрипт, который создает пронумерованную папку, а затем перемещает первые 20 файлов (упорядоченных по имени) в эту папку. Затем он должен сделать это для других файлов, увеличивая номер папки на 1, пока все файлы не будут в папках.

Я попробовал следующую команду, но она не обрабатывает автоматически весь каталог и не увеличивает автоматически номер папки:

N=1000;
for i in ${srcdir}/*; do
  [ $((N--)) = 0 ] && break
  cp -t "${dstdir}" -- "$i"
done

Как это можно сделать с помощью bash?

решение1

Этот скрипт принимает два (необязательных) аргумента: каталог для разбиения на разделы и размер раздела. Поскольку вы не сказали, хотите ли вы переместить только файлы или все, я предположил, что вы имеете в виду файлы, поэтому я использовал команду find.

Несколько комментариев,

  • Если бы вы не указали shell, то нечто подобное было бы проще сделать на Perl, Ruby или Python.
  • find с maxdepth 1 выполняет поиск только в каталоге
  • Вы можете перемещать файлы куда угодно, просто измените название папки.
  • поскольку используется find, вы можете добавить -name, -mtime, -ctime и т. д.

Кописом.ш,

#!/bin/bash
path=${1:-"."} #directory to start
howmany=${2:-20} #partition size
pushd $path; #move there
part=1; #starting partition
LIST="/usr/bin/find -maxdepth 1 -type f" #move only files?
#LIST="ls" #move everything #be careful, $folder will get moved also :-)
count=`$LIST |/usr/bin/wc -l`; #count of files to move
while [ $count -gt 0 ]; do
    folder="folder-$part";
    if [ ! -d $folder ]; then /usr/bin/mkdir -p $folder; fi
    /usr/bin/mv `$LIST |/usr/bin/sort |/usr/bin/head -$howmany` $folder/.
    count=`$LIST |/usr/bin/wc -l`; #are there more files?
    part=$(expr $part + 1)
done
popd $path

Вот скрипт для тестирования (у меня не оказалось лишних 1000 файлов),

for f in 0 1 2 3 4 5 6 7 8 9; do
  for g in 0 1 2 3 4 5 6 7 8 9; do
    for h in 0 1 2 3 4 5 6 7 8 9; do
        touch $f$g$h
    done
  done
done

решение2

Если имя файла filesName заканчивается соответствующими цифрами , forа оболочка — zsh.

for N in {0..800..20}: do
    mkdir "dir$N"
    mv "files{$N..$((N+19))}" "/path/to/dir$N/"
done

Если он находится в bash, то:

for N in {0..800..20}: do
    mkdir "dir$N"
    eval mv "files{$N..$((N+19))}" "/path/to/dir$N/"
done

Обучающий пост:Как использовать $variable в расширении последовательности в фигурных скобках оболочки?

Связанный контент