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 aj
-
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.