Deixei que um script de geração de dados demorasse muito tempo e agora tenha mais de 200.000 arquivos, dos quais preciso reduzir para cerca de 1000. Na linha de comando do Linux, existe uma maneira fácil de excluir todos, exceto 1000 desses arquivos, onde os arquivos que seriam retidos não teria dependência do nome do arquivo ou de qualquer outro atributo?
13
Respostas:
Exclua todos, exceto 1000 arquivos aleatórios em um diretório
Código:
Explicação:
/path/to/dir
comfind
;print0
: use\0
( caractere nulo ) como delimitador de linha; para que os caminhos de arquivo que contenham espaços / novas linhas não quebrem o scriptsort
;-z
: use\0
(caractere nulo) como delimitador, em vez de\n
(uma nova linha)-R
: ordem aleatóriatail
;-z
: trate a lista como delimitada a zero (igual asort
)-n +1001
: mostra linhas a partir de 1001 (ou seja, omita as primeiras 1000 linhas)xargs -0 rm
- remova os arquivos restantes;-0
: delimitado a zero, novamentePor que é melhor que a solução do quixotic *:
find
.find
não termine com\n
(nova linha) por algum motivo.* - crédito para quixotesca para
| sort -R | head -1000
, me deu um ponto de partida.fonte
find . -type f | sort -R | tail -n +1001 | xargs rm
find
? Vou tentar melhorar minha resposta, só preciso de algumas sugestões para trabalhar.tail: invalid option -- 'z'
a versão do rabo que eu tenho é 8.4 #Use um diretório temporário, depois
find
todos os seus arquivos, escolha a lista aleatoriamentesort
e mova os 1000 principais da lista para o diretório temporário. Exclua o restante e mova os arquivos de volta do diretório temporário.Se
xargs
queixa-se o comprimento da linha, usar um número menor comhead
e repetir o comando conforme necessário (isto é, a mudança-1000
para-500
e executá-lo duas vezes, ou alteração para-200
e executá-lo 5 vezes).Ele também falhará ao manipular nomes de arquivos que incluem espaços; como a resposta do @ rld mostra, você pode usar
find
o-print0
argumento de, os-z
argumentos parasort
ehead
e-0
comxargs
para garantir o manuseio adequado do nome do arquivo.Finalmente, se o
tmp-dir
já existir, você deve substituir um nome de diretório que não existe.fonte
find
incluir um espaço.Para usuários de mac, o seguinte script deve funcionar.
tr
permitirá que a classificação e a cauda trabalhem em listas com, em\n
vez de\0
.fonte
O mais fácil pode ser rm -rf o diretório e, em seguida, execute novamente o script de geração de dados, certificando-se de não executar por muito tempo.
fonte