Cópia em lote para vários diretórios

5

Tenho cerca de 9000 arquivos em um diretório e quero convertê-los em 90 arquivos em 100 diretórios por ordem de nome de arquivo, ignorando qualquer resto. Em Copie vários arquivos do nome de arquivo X para o nome de arquivo Y? , Caleb escreveu em um comentário :

If the object is just to batch them, there is a MUCH easier way! ls | xargs -iX -n20 cp X target_folder/ would run cp on files in batches of 20 until they were all done.

Portanto, com base no uso de xargs, como eu poderia mudar a pasta target_report para criar uma nova pasta e fazer um loop no comando 100 vezes?

    
por altonparker 08.06.2012 / 00:20

3 respostas

2

Em bash , tente o seguinte código:

#!/bin/bash

c=0

for f; do
    if ! ((c % 100)); then
        folder=folder_$(printf "%03d\n" $c)
        mkdir -p $folder
    fi

    [[ -d "$f" ]] || mv "$f" "$folder"
    ((c++))
done

Execute o script assim:

./script.bash *
    
por 07.10.2012 / 04:12
1

Esse comando não parece próximo do que você está tentando fazer. xargs pode ajudar, mas é complicado de usar, a menos que você saiba que os nomes dos arquivos não contêm nenhum espaço em branco ou caractere de citação. Aqui está um loop de shell que envia arquivos para subdiretórios recém-criados, 90 por diretório.

set -- *
# Set args to "$1" "$2" ... "$90"
i=1 args=
while [ $i -le 90 ]; do
  slice="$slice \"\${$i}\""
  i=$((i+1))
done
# Move files 90 at a time
i=0
while [ $# -ge 90 ]; do
  mkdir part$i
  eval "mv $slice part$i"
  shift 90
done
# 0 to 89 files remain in the current directory
    
por 08.06.2012 / 01:53
0

parallel suporta a execução de vários comandos com \; e {#} é o número de sequência:

ls|parallel -n90 mkdir {#}\;mv {} {#}

Ou se os nomes dos arquivos não contiverem espaços, aspas ou barras invertidas:

i=1;while read l;do mkdir $i;mv $l $((i++));done< <(ls|xargs -n90)
    
por 16.06.2014 / 06:55

Tags