Você pode usar for
, que faz um loop nos arquivos de forma ordenada e nos permite evitar a análise da saída de find
ou ls
, para evitar problemas com espaços e outros caracteres especiais em nomes de arquivos. Muito obrigado ao @muru por melhorar isso:)
i=0; j=$(stat ~/Documents/* --printf "%i\n" | wc -l); for k in ~/Documents/*; do if (( (j - ++i) < 8 )); then echo mv -v "$k" ~/AnotherDirectory; fi; done
Teste primeiro com echo
, depois remova echo
para realmente mover os arquivos.
Como um script:
#!/bin/bash
i=0
j=$(stat ~/Documents/* --printf "%i\n" | wc -l )
for k in ~/Documents/*; do
if (( (j - ++i) < 8 )); then
echo mv -v -- "$k" ~/AnotherDirectory
fi
done
novamente, remova echo
após o teste para mover os arquivos para real
Explicação
-
i=0
dizendo ao shell para iniciar a iteração a 0 -
j=$(stat ~/Documents/* --printf "%i\n" | wc -l )
esta definindo a variávelj
para um número inteiro igual ao número total de arquivos no diretório. Obrigado à resposta do Serg à minha própria pergunta sobre como contar os arquivos de forma confiável, não importa quais caracteres seus nomes contenham -
do if (( (j - ++i) < 8 ))
para cada iteração do loop, teste se o resultado dej
menos o número de vezes que o loop foi executado é menor que 8 e se é -
mv -v -- "$k" ~/AnotherDirectory
move o arquivo para o novo diretório