Remove todos os arquivos, exceto N, do diretório recursivamente

4

Eu gostaria de reduzir um grande banco de dados da linha de comando para N arquivos, muito semelhantes a esta pergunta faz. A única diferença é que a maioria dos meus arquivos estão em subdiretórios, então eu estava me perguntando se havia uma solução rápida para o meu problema ou se exigiria uma ação mais profunda. Atualmente, meu comando parece com (com o (N+1) substituído pelo número apropriado):

find . -type f | sort -R | tail -n +(N+1) | xargs rm

Originalmente, pensei que isso funcionaria porque o find por natureza é recursivo e tentei adicionar o -r (sinalizador recursivo) em torno do rm , pois a saída indica que ele está selecionando aleatoriamente os arquivos, mas não consegue -los para apagar. Alguma idéia?

EDITAR: Meu novo comando é assim:

find . -type f -print0 | sort -R | tail -n +(N+1) | xargs -0 rm

e agora recebo o erro dizendo rm: missing operand . Além disso, estou em uma máquina do CentOS, portanto, o sinalizador -z está indisponível para mim.

EDIT # 2 Este comando é executado:

find . -type f -print0 | sort -R | tail -n +(N+1) | xargs -0 -r rm

mas quando executo um find . -type f | wc -l para obter o número de arquivos no diretório (que deve ser N se o comando funcionou corretamente) não mudou da quantidade inicial de arquivos.

    
por Alerra 11.07.2018 / 20:16

2 respostas

1

Se você precisar usar find … -print0 e não for possível usar -z com sort e / ou tail , existe uma possível solução alternativa, porém incômoda (substitua (N+1) como de costume):

find . -type f -printf "%i\n" | sort | uniq | sort -R | tail -n +(N+1) |
   while read i; do
      find . -type f -inum "$i" -delete
   done

O truque sujo é que usamos números de inode em vez de caminhos.

O find interno remove todos os arquivos com o número de inode fornecido no diretório atual, portanto, se alguns arquivos forem vinculados um ao outro, você perderá todos ou manterá todos eles.

Preliminary sort | uniq é para evitar um contratempo quando você perde muito devido a números de inodes duplicados devido a hardlinks. Você pode acabar com mais de N nomes de arquivos, apontando para até N inodes distintos no total.

Caso o seu find não entenda -delete , use -exec rm {} + .

    
por 12.07.2018 / 14:48
0

Eu fiz isso no osx como

find . -type f -print | sort | uniq | sort --random-sort | tail -n +1000 | xargs rm -f

Onde meu N foi 1000 . Você pode então verificar o número correto de arquivos remanescentes com ls | wc -l . Veja também link

    
por 04.08.2018 / 22:52