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

2

Então, cometi um pequeno erro estúpido. Durante o processo de coleta de dados de uma fonte, eu despejei tudo na raiz do meu disco externo, que agora tem 600k + arquivos (totalizando 23 shows). Aqui estão algumas opções que eu gostaria de fazer:

  1. Mova um determinado número de arquivos do disco para o meu disco rígido.
  2. Crie subpastas (com 1000 arquivos de cada subpasta) e distribua arquivos entre elas.
  3. Tar a coisa toda ou parte dela (digamos 50.000 arquivos) e mova-os para o meu disco.

Mas qualquer coisa que eu tente fazer, parece que leva uma eternidade. Alguém pode me ajudar sobre a maneira ideal / mais eficiente de fazer qualquer um desses? Obrigado.

    
por khan 02.11.2015 / 17:31

1 resposta

0

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' 'xargs -0r' para converter novas linhas em caracteres NUL para alimentar em \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
    
por 02.11.2015 / 23:50