Movendo um número especificado de arquivos de um diretório para outro no Linux Redhat [closed]

0

Alguém realmente sabe como mover arquivos X de uma vez de um diretório para outro? Cada "exemplo" nesta página exibe um erro e é inútil. Só consigo mover cinquenta (50) arquivos de uma só vez e depois "dormir" por um período de tempo. Os nomes dos arquivos são todos diferentes, mas a extensão é a mesma. Como afirmei, todo exemplo 'ls' produz um erro dentro do Redhat.

    
por New 2 Overflow 11.09.2018 / 21:39

2 respostas

1

Para mover um determinado número de arquivos de cada vez e dormir 5 segundos entre os movimentos, você pode usar algo semelhante ao seguinte one-liner enquanto estiver no diretório de origem:

 while true; do mv -v $(ls -1 *yyy | head -n 5) otherdir/ ; sleep 5; done

Onde yyy é igual à sua extensão de arquivo comum, -n 5 representa a movimentação de 5 arquivos por vez e otherdir é o seu diretório de destino. Você precisará ajustar o loop para atender às suas necessidades, conforme listado aqui, ele lançará erros assim que todos os arquivos de origem forem movidos.

    
por 11.09.2018 / 22:27
1

Um pequeno script, que pode ser ajustado para aceitar a extensão e o diretório de destino, realizará esta tarefa:

#!/bin/bash

files=$(find . -maxdepth 1 -type f -name "*.txt" | head -n50)

while [[ ! -z $files ]]; do
  for f in $files; do
    mv $f ../t2
  done

  files=$(find . -maxdepth 1 -type f -name "*.txt" | head -n50)
done

Testado em um diretório onde criei 1.067 arquivos e eles foram movidos.

Tenho certeza de que também há uma maneira de otimizar esse script.

Editar:

Conforme observado por um comentário, o script acima não considera espaços. Uma abordagem que leve em consideração os espaços (mas talvez não todos os caracteres especiais, especialmente os retornos de carro nos nomes dos arquivos), pode parecer:

#!/bin/bash

function move50() {
  local NUM=0
  find . -name "*.txt" | head -n50 | (while read -r f; do
     echo "   $f"
      mv "$f" ../t2
      (( NUM++ ))
  done
  return $NUM)
}


cntr=1
while [[ $cntr -gt 0 ]]; do
  move50
  cntr=$?
done

Essa abordagem manipulará arquivos com espaços nos nomes.

    
por 11.09.2018 / 22:28

Tags