Então, cometi um pequeno erro estúpido. Durante o processo de coleta de dados de uma fonte, despejei tudo na raiz do meu disco externo, que agora possui mais de 600 mil arquivos (totalizando 23 GB). Aqui estão as seguintes opções que eu gostaria de fazer:
- Mova um certo número de arquivos do disco para o meu disco rígido.
- Crie subpastas (com 1000 arquivos cada subpasta) e distribua os arquivos entre elas.
- Tar tudo ou parte dele (digamos 50.000 arquivos) e mova-os para o meu disco.
Mas tudo o que tento fazer parece que leva uma eternidade. Alguém pode me ajudar sobre a maneira ideal/mais eficiente de fazer qualquer uma dessas coisas? Obrigado.
Responder1
O seguinte criará um subdiretório chamado new
e, em seguida, 50 subdiretórios numerados de new
chamados new/01
.. new/50
. Em seguida, ele moverá no máximo 1.000 arquivos do diretório atual para cada um dos new/*
diretórios.
NOTA1: Não funcionará se algum dosnomes de arquivostêm novas linhas ( \n
) neles.
NOTA2: isso requer GNU xargs
e GNU mv
. Você está executando o Linux, então eles são padrão.
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 todos os arquivos que você deseja mover corresponderem a um padrão específico, você poderá usar localizar -name
ou -regex
opções para selecioná-los. adicione as opções imediatamente após o -type f
. por exemplo, se você quiser mover apenas .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 xargs -d
a opção, mas você pode usar tr '\n' '\0'
para converter novas linhas em caracteres NUL para alimentação xargs -0r
- novamente, isso funciona com qualquer arquivo que não tenha a \n
no nome do arquivo. -R -1
não é posix, uma extensão freebsd para xargs
, você pode remover essa opção com segurança, mas a mv
operação será muito mais lenta.
#! /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