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/dir
comfind
;-
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 -1000
não termine com %code% (nova linha) por algum motivo.
* - crédito para quixotic por %code% , me deu um ponto de partida.