Como excluo todos, exceto o arquivo mais novo em uma pasta? [duplicado]

0

Estou usando o CentOS 7. Em um diretório específico, desejo excluir todos os arquivos "* .log", exceto o mais novo. Eu tentei isso

[rails@server ~]$ ls -t ~/.forever | tail -n +2 | xargs rm --
rm: cannot remove ‘pids’: No such file or directory
rm: cannot remove ‘5QEM.log’: No such file or directory
rm: cannot remove ‘sock’: No such file or directory
rm: cannot remove ‘8BVT.log’: No such file or directory
rm: cannot remove ‘lf4N.log’: No such file or directory
rm: cannot remove ‘Jf8F.log’: No such file or directory
rm: cannot remove ‘H1UG.log’: No such file or directory
rm: cannot remove ‘sNbx.log’: No such file or directory
rm: cannot remove ‘D30J.log’: No such file or directory
rm: cannot remove ‘_yj1.log’: No such file or directory
rm: cannot remove ‘Tz9c.log’: No such file or directory
rm: cannot remove ‘ur0M.log’: No such file or directory
rm: cannot remove ‘pX6o.log’: No such file or directory
rm: cannot remove ‘8P_i.log’: No such file or directory
rm: cannot remove ‘kBX_.log’: No such file or directory
rm: cannot remove ‘n4Ot.log’: No such file or directory
rm: cannot remove ‘VVdY.log’: No such file or directory
rm: cannot remove ‘T1QJ.log’: No such file or directory
rm: cannot remove ‘Zdeo.log’: No such file or directory
rm: cannot remove ‘5ejy.log’: No such file or directory
rm: cannot remove ‘dQEL.log’: No such file or directory

Não sei exatamente o que a saída significa, mas o resultado é que nada é excluído. Estou interessado apenas em excluir arquivos-filhos diretos (em oposição a arquivos em subpastas).

    
por Dave 15.05.2018 / 03:13

3 respostas

1

Use a localização:

Isso excluirá todos os arquivos e pastas, exceto o mais novo no diretório atual; ele verificará o arquivo mais recente somente na pasta direta e não no subdiretório conforme solicitado.

find . -maxdepth 1 ! -path .  ! -wholename 'find . -maxdepth 1  -printf '%T+ %p\n' | sort -n | tail -1 | cut -d " " -f2' -exec rm -rf {} \;

e para excluir apenas arquivos e não pastas, use -type f

find . -maxdepth 1 -type f  ! -path .  ! -wholename 'find . -maxdepth 1  -printf '%T+ %p\n' | sort -n | tail -1 | cut -d " " -f2'  -exec rm -rf {} \;

Exemplo:

$ touch {1..100}
$ echo "hello" > 89
$ find . -maxdepth 1 -type f  ! -path .  ! -wholename 'find . -maxdepth 1  -printf '%T+ %p\n' | sort -n | tail -1 | cut -d " " -f2'  -exec rm -rf {} \;
$ ls
89
    
por 15.05.2018 / 10:29
0

Você está listando os nomes no diretório .forever , mas execute o comando rm um nível acima. Espero que você não tenha arquivos importantes com os mesmos nomes.

Se você vai colocar isso em um script, pode ser mais fácil apenas cd no diretório em que você deseja remover os arquivos, mas prefixar o nome do diretório na chamada xargs também é uma opção. / p>

É claro que o comentário preventivo sobre não usar a saída de ls é válido, mas dependendo dos nomes de arquivo no seu caso, você pode se safar.

    
por 15.05.2018 / 07:02
0

Usando o zsh:

zsh -c 'rm ~/.forever/*.log(.om[2,-1])'

Desembalando isso:

  • usando um glob de linha de base de ~/.forever/*.log
  • selecione apenas arquivos regulares ( . )
  • o rder (classifica-os) por m tempo de odificação (isto coloca os arquivos mais novos à frente dos arquivos mais antigos)
  • selecione na lista ordenada o intervalo 2 até o último ( -1 ) - isso deixa de fora o elemento nº 1, o arquivo mais recente
  • que depois passa a ser a lista de arquivos passados para rm

Referências:

por 16.05.2018 / 18:49