Extrai os últimos 100 arquivos em todos os subdiretórios, cada diretório possui um número variável de arquivos [duplicados]

1

Eu tenho um diretório com 6 subdiretórios. Cada subdiretório também possui um número variável de subdiretórios. Esses últimos diretórios possuem números variáveis de *.jpg files. Os arquivos jpg são nomeados no formulário 0000.jpg , 0001.jpg e assim por diante.

Estou interessado em obter os últimos 100% dos arquivos*.jpg (todos os diretórios têm > 100 arquivos) e armazená-los em diretórios separados com estrutura semelhante aos diretórios originais.

Qual é a melhor maneira de fazer isso?

    
por H.H 04.04.2017 / 19:02

1 resposta

0

No pai com os 6 subdiretórios:

mkdir ../newdirs

Então:

for d in */*; do mkdir -p ../newdirs/"$d"; i=0; j=$(stat "$d"/* --printf "%i\n" | wc -l); for f in "$d"/*; do [[ -f "$f" ]] && (( (j - ++i) < 100 )) && echo mv -v -- "$f" ../newdirs/"$d"; done; done

Remover echo após o teste para mover os arquivos.
Mais claramente:

for d in */*; do 
  mkdir -p ../newdirs/"$d" 
  i=0
  j=$(stat "$d"/* --printf "%i\n" | wc -l)
  for f in "$d"/*; do 
    [[ -f "$f" ]] && 
    (( (j - ++i) < 100 )) && 
      echo mv -v -- "$f" ../newdirs/"$d"
  done
done

Notas

  • mkdir ../newdirs cria um novo diretório para os arquivos movidos no mesmo nível que o atual (ou seja, no pai .. de ambos)
  • for d in */*; do para cada subdiretório ...
  • mkdir -p ../newdirs/"$d" cria um diretório na estrutura paralela, usando -p para criar diretórios pai conforme necessário e
  • i=0 define uma variável como 0 para contar as iterações
  • j=$(stat "$d"/* --printf "%i\n" | wc -l) conta os arquivos no subdiretório e atribui esse número a j
  • for f in "$d"/*; do para todo o conteúdo dos subdiretórios
  • [[ -f "$f" ]] && se for um arquivo
  • (( (j - ++i) < 100 )) && e se o número de arquivos no diretório menos o número de vezes que o loop foi executado é menor que 100, então ...
  • mv -v -- "$f" ../newdirs/"$d" move o arquivo para o diretório correspondente na nova estrutura.

for itera sobre os arquivos de uma forma ordenada, então este método fornecerá os últimos 100 arquivos listados numericamente.

Você pode ajustar ../newdirs para o caminho desejado.

    
por Zanna 04.04.2017 / 19:28