remover arquivos mais antigos

remover arquivos mais antigos

Estou tentando excluir arquivos antigos do diretório e deixar apenas os três arquivos mais recentes.

cd /home/user1/test

while [ `ls -lAR | grep ^- | wc -l` < 3 ] ; do

    rm `ls -t1 /home/user/test | tail -1`
    echo " - - - "

done

algo está errado com a declaração condicional.

Responder1

Se você quiser fazer um loop nos arquivos,nunca usels*. dr Existem muitas situações em que você acabaria excluindo o arquivo errado ou até mesmo todos os arquivos.

Dito isto, infelizmente, isso é algo complicado de fazer no Bash. Há uma resposta funcional em umpergunta duplicada meu ainda mais velhofind_date_sortedque você pode usar com pequenas modificações:

counter=0
while IFS= read -r -d '' -u 9
do
    let ++counter
    if [[ counter -gt 3 ]]
    then
        path="${REPLY#* }" # Remove the modification time
        echo -e "$path" # Test
        # rm -v -- "$path" # Uncomment when you're sure it works
    fi
done 9< <(find . -mindepth 1 -type f -printf '%TY-%Tm-%TdT%TH:%TM:%TS %p\0' | sort -rz) # Find and sort by date, newest first

* Sem ofensa, pessoal - eu também usei lsantes. Mas realmente não é seguro.

Editar:Novofind_date_sortedcom testes unitários.

Responder2

Para excluir todos os arquivos, exceto os três mais recentes, usando um zsh glob, você pode usar Om(O maiúsculo) para classificar os arquivos do mais antigo para o mais novo e um subscrito para obter os arquivos desejados.

rm ./*(Om[1,-4])
#    | ||||  ` stop at the 4th to the last file (leaving out the 3 newest)
#    | |||` start with first file (oldest in this case)
#    | ||` subscript to pick one or a range of files
#    | |` look at modified time
#    | ` sort in descending order
#    ` start by looking at all files

Outros exemplos:

# delete oldest file (both do the same thing)
rm ./*(Om[1])
rm ./*(om[-1])

# delete oldest two files
rm ./*(Om[1,2])

# delete everything but the oldest file
rm ./*(om[1,-2])

Responder3

De longe, o método mais fácil é usar zsh e seueliminatórias globais: Ompara classificar por idade decrescente (ou seja, o mais velho primeiro) e [1,3]reter apenas as três primeiras correspondências.

rm ./*(Om[1,3])

Veja tambémComo faço para filtrar um glob em zshpara mais exemplos.

E preste atençãoConselho de l0b0: seu código irá quebrar horrivelmente se você tiver nomes de arquivos que contenham caracteres especiais do shell.

Responder4

Primeiro, a -Ropção é por recursão, o que provavelmente não é o que você deseja - isso também pesquisará em todos os subdiretórios. Segundo, o <operador (quando não é visto como redirecionamento) serve para comparação de strings. Você provavelmente quer -lt. Tentar:

while [ `ls -1A | grep ^- | wc -l` -lt 3 ]

Mas eu usaria find aqui:

while [ `find . -maxdepth 1 -type f -print | wc -l` -lt 3 ]

informação relacionada