Como recursivamente mover lotes de 20 arquivos em pastas numeradas da pasta de 1000 arquivos

1

Eu tenho uma pasta cheia de 1000 (ou mais) arquivos. Eu quero ter um script que cria uma pasta numerada e, em seguida, move os primeiros 20 arquivos (ordenados por nome) para essa pasta. Ele deve fazer isso para os outros arquivos, aumentando o número da pasta em 1, até que todos os arquivos estejam em pastas.

Eu tentei o seguinte comando, mas ele não faz um diretório inteiro automaticamente e não incrementa o número da pasta automaticamente:

N=1000;
for i in ${srcdir}/*; do
  [ $((N--)) = 0 ] && break
  cp -t "${dstdir}" -- "$i"
done

Como isso pode ser feito usando o bash?

    
por hellocatfood 17.10.2013 / 22:34

2 respostas

2

Esse script recebe dois argumentos (opcionais), o diretório a ser particionado e o tamanho da partição. Como você não disse se deseja mover arquivos ou mover tudo, presumi que você queria dizer arquivos, então usei o comando find.

Alguns comentários,

  • Se você não especificou shell, algo assim é mais facilmente feito em perl, ruby ou python.
  • localizar com o maxdepth 1 faz apenas o diretório
  • você pode mover os arquivos para qualquer lugar, basta alterar a nomenclatura da pasta
  • desde que o find é usado, você pode adicionar -name, -mtime, -ctime, etc.

Copysome.sh,

#!/bin/bash
path=${1:-"."} #directory to start
howmany=${2:-20} #partition size
pushd $path; #move there
part=1; #starting partition
LIST="/usr/bin/find -maxdepth 1 -type f" #move only files?
#LIST="ls" #move everything #be careful, $folder will get moved also :-)
count='$LIST |/usr/bin/wc -l'; #count of files to move
while [ $count -gt 0 ]; do
    folder="folder-$part";
    if [ ! -d $folder ]; then /usr/bin/mkdir -p $folder; fi
    /usr/bin/mv '$LIST |/usr/bin/sort |/usr/bin/head -$howmany' $folder/.
    count='$LIST |/usr/bin/wc -l'; #are there more files?
    part=$(expr $part + 1)
done
popd $path

Aqui está um script para testar (eu não tinha mais 1000 arquivos por aí),

for f in 0 1 2 3 4 5 6 7 8 9; do
  for g in 0 1 2 3 4 5 6 7 8 9; do
    for h in 0 1 2 3 4 5 6 7 8 9; do
        touch $f$g$h
    done
  done
done
    
por 18.10.2013 / 02:46
0

Apenas um loop for deve ser suficiente quando o nome do seu arquivo termina com os números correspondentes, mas o shell é zsh .

for N in {0..800..20}: do
    mkdir "dir$N"
    mv "files{$N..$((N+19))}" "/path/to/dir$N/"
done

Se estiver em bash , então:

for N in {0..800..20}: do
    mkdir "dir$N"
    eval mv "files{$N..$((N+19))}" "/path/to/dir$N/"
done

Postagem de aprendizado: Como posso usar a variável $ em uma expansão de chave de concha de uma seqüência?

    
por 28.08.2017 / 20:13