A seguir, será criado um subdiretório denominado new
e, em seguida, 50 subdiretórios numerados de new
chamados new/01
.. new/50
. Em seguida, ele moverá um máximo de 1000 arquivos do diretório atual para cada um dos diretórios new/*
.
NOTA 1: Não funcionará se qualquer um dos nomes de arquivos tiver novas linhas ( \n
) neles.
NOTA2: isso requer o GNU xargs
e o GNU mv
. Você está rodando o linux, então esses são padrões.
Você pode alterar os números (50 e 1000) e o diretório base para atender às suas necessidades.
#! /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
Se os arquivos que você deseja mover todos corresponderem a um padrão específico, você poderá usar as opções -name
ou -regex
do find para selecioná-los. adicione a (s) opção (ões) imediatamente após o -type f
. por exemplo. se você quisesse mover somente .txt
arquivos:
find . -maxdepth 1 -type f -name '*.txt' | head -n "$FILECOUNT" | xargs -d'\n' mv -t "$BASEDIR/$i"
Uma versão não-GNU não pode usar mv -t
. ele também não pode usar a opção xargs -d
, mas você pode usar tr '\n' '
para converter novas linhas em caracteres NUL para alimentar em xargs -0r
'\n
- novamente, isso lida com qualquer arquivo que não tenha -R -1
no nome do arquivo. xargs
é non-posix, uma extensão freebsd para mv
, você pode remover com segurança essa opção, mas a operação %code% será executada muito mais devagar.
#! /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' '#! /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
' | xargs -0r -R -1 -I % mv % "$BASEDIR/$i"
done