Como copiar/tar arquivos de uma pasta com grande número de arquivos?

Como copiar/tar arquivos de uma pasta com grande número de arquivos?

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:

  1. Mova um certo número de arquivos do disco para o meu disco rígido.
  2. Crie subpastas (com 1000 arquivos cada subpasta) e distribua os arquivos entre elas.
  3. 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 newe, em seguida, 50 subdiretórios numerados de newchamados 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 xargse 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 -nameou -regexopções para selecioná-los. adicione as opções imediatamente após o -type f. por exemplo, se você quiser mover apenas .txtarquivos:

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 -da 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 \nno nome do arquivo. -R -1não é posix, uma extensão freebsd para xargs, você pode remover essa opção com segurança, mas a mvoperaçã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

informação relacionada