Bash Script para excluir arquivos mais antigos, mas manter os arquivos mais recentes, incluindo subdiretórios

Bash Script para excluir arquivos mais antigos, mas manter os arquivos mais recentes, incluindo subdiretórios

Estou tentando excluir arquivos antigos, mas devo manter os arquivos de log dos últimos 3 dias. Tentei o comando abaixo,

ls -tr /home/httpd/htdocs/nome do caminho/nome do caminho/config//build/logs/apps/.log | cauda -n +4 | xargs rm --

mas foi excluído, todos os arquivos retêm apenas 3 arquivos em uma pasta. mas quero manter 3 arquivos em cada pasta separadamente.

alguém pode me ajudar a resolver esse problema.

Responder1

Você pode tentar isso, colocar o seguinte conteúdo em um arquivo de script de shell e executá-lo.

#!/bin/bash
dirs=($(find /tmp/test -type d))
for dir in "${dirs[@]}"; do
  cd "$dir"
  ls -pt | grep -v / | tail -n +4 | xargs rm -f
done

substitua /tmp/testpelo nome do seu diretório.

Responder2

Você poderia usar este comando:

ls -t path | sed -e '1,3d' | xargs -d '\n' rm

Ou em um loop:

for d in $(find path -type d); do
  ls -t "$d" | sed -e '1,3d' | xargs -d '\n' rm
done

Onde:

  • ls -t: lista os arquivos em ordem decrescente de hora de modificação, um nome de arquivo por linha.
  • sed -e '1,3d': exclui as 3 primeiras linhas
  • xargs -d '\n' rm: para cada linha de entrada (sem a nova linha final), passa-a como um argumento para rm.
  • -d '\n': isso é necessário para eficiência, para fazer com que xargs considere cada linha de entrada um argumento separado, mas passe quantos argumentos couberem em uma linha de comando de uma só vez, para que rm não seja invocado novamente para cada um.

Para mais possibilidades, veja a postagem Exclua todos os arquivos X, exceto os mais recentes, no bash.

informação relacionada