Excluir todos os arquivos aleatórios, exceto 1000, em um diretório
Código:
find /path/to/dir -type f -print0 | sort -zR | tail -zn +1001 | xargs -0 rm
Explicação:
- Listar todos os arquivos em
/path/to/dircomfind;-
print0: use( caractere nulo ) como o delimitador de linha; então caminhos de arquivo contendo espaços / novas linhas não quebram o scriptsort
-
- Embaralhe a lista de arquivos com
-z;-
: use\n-R(caractere nulo) como delimitador, em vez detail(uma nova linha) -
-z: ordem aleatória
-
- Retire as primeiras 1000 linhas da lista aleatória com
sort;-
-n +1001: trata a lista como delimitada por zero (igual a comxargs -0 rm) -
-0: mostra as linhas a partir de 1001 (ou seja, omite as primeiras 1000 linhas)
-
-
find- remove os arquivos restantes;-
find: delimitado por zero, novamente
-
Por que é melhor do que a solução da quixotic *:
- Funciona com nomes de arquivos contendo espaços / novas linhas.
- Não tenta criar nenhum diretório (que já pode existir, btw.)
- Não move nenhum arquivo, nem sequer toca nos 1000 "arquivos da sorte", além de listá-los com
\n. - Evita perder um arquivo caso a saída de
| sort -R | head -1000não termine com %code% (nova linha) por algum motivo.
* - crédito para quixotic por %code% , me deu um ponto de partida.