Copie subpastas contendo pelo menos n arquivos

3

Eu tenho uma pasta root_folder contendo muitas subpastas. Cada uma dessas subpastas contém um pequeno número de arquivos (entre 1 e 20) e eu quero copiar todas as subpastas contendo pelo menos 5 arquivos para outra pasta new_folder . Descobri como imprimir as pastas que me interessam: link mas não como copiá-los.

    
por fonfonx 09.05.2016 / 11:09

3 respostas

4

Você pode fazer um loop for no resultado da busca e copiar a pasta com -R:

IFS=$'\n'
for source_folder in "$(find . -maxdepth 1 -type d -exec bash -c "echo -ne '{}\t'; ls '{}' | wc -l" \; |  
awk -F"\t" '$NF>=5{print $1}');" do 
  if [[ "$source_folder" != "." ]]; then 
    cp -R "$source_folder" /destination/folder
  fi
done
    
por 09.05.2016 / 11:24
3

Abaixo, o script funciona para o seu caso:

find . -mindepth 1 -maxdepth 1 -type d -print0 | while read -rd '' line
do  files=("$line"/* "$line"/.*)
count=${#files[@]};((count-=2))
if [ $count -ge 5 ]
then
cp -R "$line" ../newfolder/
fi
done

Observação: isso deve ser executado a partir da pasta base, pois estou usando caminhos relativos.

    
por 09.05.2016 / 11:46
2

Iterando os subdiretórios de um diretório:

for subdir in root_folder/*/; do
  if [ -L "${subdir%/}" ]; then continue; fi
  …
done

A linha if [ -L … ignora links simbólicos para diretórios. Omitir, se você quiser incluir links simbólicos para diretórios ou se você sabe que não haverá nenhum.

Os diretórios cujo nome começa com . (diretórios de pontos) não serão incluídos. Para incluí-los, no bash, execute shopt -s dotglob .

Para contar o número de arquivos em um diretório, no bash, armazene-os em uma matriz e conte o número de elementos. Execute shopt -s nullglob para obter 0 para um diretório vazio (caso contrário, o padrão de glob * permanecerá não expandido se não corresponder a nada, portanto você obterá 1 em vez de 0).

Assim:

#!/bin/bash
shopt -s nullglob dotglob
for subdir in root_folder/*/; do
  if [ -L "${subdir%/}" ]; then continue; fi
  files=("$subdir"/*)
  if ((${#files[@]} >= 5)); then
    cp -Rp "$subdir" new_folder/
  fi
done
    
por 10.05.2016 / 13:39