Localizando e removendo arquivos com mais de 30 dias

2

Estou tentando limpar os arquivos de usuários com mais de 30 dias. O seguinte script bash funciona perfeitamente bem. No entanto, estou tentando remover o erro "Nenhum arquivo ou diretório" mostrado na saída, pois tenho meu próprio eco. Alguém pode ajudar por favor?

Código:

if [[ $(find /h/$USER/*.txt -mtime +30) ]]
then
    find /h/$USER/*.txt -mtime +30 -print -exec rm -f {} \;
else
    echo "No txt files to del"
fi

Saída:

find: stat() error /h/username/*.txt: No such file or directory
No text files to del
    
por StackmeUp123 17.08.2017 / 16:18

5 respostas

1

O problema aqui é que você está usando o shell globs ao invés de find para listar os arquivos txt (ele também excluirá arquivos txt ocultos, e se algum .txt for do tipo type, ele entrará em -los para apagar todos os arquivos antigos lá). Shells como bash , quando o glob não corresponde a nenhum arquivo, passa o glob asis para find e find reclama sobre esse arquivo *.txt não existente.

Você poderia apenas fazer:

LC_ALL=C find "/h/$USER/." ! -name . -prune \
  -name '*.txt' ! -type d -mtime +30 -print -exec rm -f {} + |
  grep '^' > /dev/null || echo >&2 No text files to del

O grep é para verificar se find produz alguma saída (sem erros), então nós enviamos a mensagem Nenhum arquivo de texto para del se não foi (remova o > /dev/null se você deseja ver os arquivos que tentamos excluir). Observe que perdemos o status de saída de find no processo.

Você também pode usar zsh em vez disso, cujas globs podem verificar as idades dos arquivos (você já está usando a sintaxe zsh não citando essa $USER ):

oldfiles=(/h/$USER/*.txt(NDm+30^/))
if (($#oldfile)); then
  rm -f -- $oldfiles
else
  echo >&2 No text files to del
fi
    
por 17.08.2017 / 16:51
1

É assim que eu faço, executado em vários diretórios que queremos limpar todas as noites.

find /h/$USER -maxdepth 1 -name "*.txt" -type f -mtime +30 -delete

Não sei dizer se é a melhor ou a pior maneira de fazer isso, mas está funcionando há anos sem nenhum problema, na verdade uma coleção de limpadores de lixo, a mesma sintaxe, sem problemas, então acho que é bom o suficiente para produção .

    
por 10.03.2018 / 07:44
0

Use o comando abaixo para redirecionar o erro para / dev / null. então o erro não será exibido

find path -type f -daystart -mtime +30 -exec rm -rvf {} \;  2>/dev/null
    
por 06.02.2018 / 09:11
-1

O comando find geralmente requer um tipo específico (f para file, d para directory, b para block device, c para character, etc) associado à sua pesquisa se você estiver anotando curingas. Para esta situação, pode ser mais propício também usar um loop for, em vez de uma instrução if, também usando a opção --max-depth, talvez útil para encontrar arquivos ocultos /

Código:

    for i in $(find /h/$USER/ -type f -name "*.txt" -mtime +30 2> /dev/null);
    do
    rm -rf  $i 2> /dev/null;
    done
    
por 17.08.2017 / 18:31
-2

Supondo excluir o arquivo de dezembro primeiro liste o arquivo ls -l | grep "Dec" segundo se vc estiver satisfeito, vai apagar rm ls -l|grep "Dec" Deixe-me saber seu feedback. :)

    
por 06.02.2018 / 08:33