Далее будет создан подкаталог с именем new
, а затем 50 пронумерованных подкаталогов в new
с именем new / 01
.. new / 50
. Затем он переместит максимум 1000 файлов из текущего каталога в каждый из каталогов new / *
.
ПРИМЕЧАНИЕ 1. Это не будет работать, если в каком-либо из имен файлов есть символы новой строки ( \ n
).
ПРИМЕЧАНИЕ 2: для этого требуются GNU xargs
и GNU mv
. Вы используете Linux, поэтому они стандартные.
Вы можете изменить номера (50 и 1000) и базовый каталог в соответствии с вашими потребностями.
#! /bin/sh
BASEDIR='new'
SUBDIRS=50
FILECOUNT=1000
mkdir -p "$BASEDIR"
for i in $(seq -w 1 "$SUBDIRS") ; do
mkdir -p "$BASEDIR/$i"
# move maximum of $FILECOUNT files to new/$i
find . -maxdepth 1 -type f | head -n "$FILECOUNT" | xargs -d'\n' mv -t "$BASEDIR/$i"
done
Если все файлы, которые вы хотите переместить, соответствуют определенному шаблону, вы можете использовать параметры find -name
или -regex
, чтобы выбрать их. добавьте опции сразу после -типа f
. например если вы хотите переместить только файлы .txt
:
find . -maxdepth 1 -type f -name '*.txt' | head -n "$FILECOUNT" | xargs -d'\n' mv -t "$BASEDIR/$i"
Версия, отличная от GNU, не может использовать mv -t
. он также не может использовать параметр xargs -d
, но вы можете использовать tr '\ n' '\ 0'
для преобразования новой строки в символы NUL для ввода в xargs -0r
- опять же, это справляется с любым файлом, у которого нет \ n
в имени файла. -R -1
не является posix, это расширение freebsd для xargs
, вы можете безопасно удалить этот параметр, но операция mv
будет выполняться намного медленнее.
#! /bin/sh
BASEDIR='new'
SUBDIRS=50
FILECOUNT=1000
mkdir -p "$BASEDIR"
for i in $(seq -w 1 "$SUBDIRS") ; do
mkdir -p "$BASEDIR/$i"
# move maximum of $FILECOUNT files to new/$i
find . -maxdepth 1 -type f | head -n "$FILECOUNT" | tr '\n' '\0' | xargs -0r -R -1 -I % mv % "$BASEDIR/$i"
done