Se você deseja fazer um loop sobre arquivos, nunca usels
*. tl; dr Há muitas situações em que você acaba excluindo o arquivo errado ou mesmo todos os arquivos.
Dito isto, infelizmente, isso é algo complicado de se fazer no Bash. Há uma resposta de trabalho em uma pergunta duplicada ainda mais antiga,find_date_sorted
que 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 ofensas, eu também usei ls
antes. Mas isso realmente não é seguro.
Edit: Novofind_date_sorted
com testes de unidade.
((++counter>3))
como seu teste. É bem sucinto. Quanto aos oneliners: se a brevidade é uma preocupação, envolva o código em uma função, então não se preocupe.Para excluir todos os arquivos, exceto os três mais novos, usando o zsh glob, você pode usar
Om
(capital O) para classificar os arquivos do mais antigo para o mais novo e um índice para capturar os arquivos desejados.Outros exemplos:
fonte
De longe, o método mais fácil é usar o zsh e seus qualificadores globais :
Om
classificar por idade decrescente (ou seja, a mais antiga primeiro) e[1,3]
reter apenas as três primeiras partidas.Veja também Como filtrar uma glob no zsh para obter mais exemplos.
E siga o conselho do l0b0 : seu código será quebrado de forma horrível se você tiver nomes de arquivos que contenham caracteres especiais do shell.
fonte
Você pode usar a seguinte função para obter o arquivo mais recente em um diretório:
Dê a ele um conjunto diferente de arquivos, exulcando o arquivo mais recente após cada iteração.
Dica: Se você mantiver o conjunto inicial de arquivos em uma matriz chamada "$ {files [@]}", salve o índice do arquivo mais recente encontrado e
unset 'files[index]'
antes da próxima iteração.Uso:
newest_in [set of files/directories]
Saída de amostra:
fonte
Primeiro, a
-R
opção é recursão, o que provavelmente não é o que você deseja - que também procurará em todos os subdiretórios. Segundo, o<
operador (quando não está sendo visto como redirecionamento) é para comparação de cadeias. Você provavelmente quer-lt
. Tentar:Mas eu usaria find aqui:
fonte
Eu sei que é um pecado analisar
ls
, mas e quanto a isso:Um teste rápido com 5 arquivos vazios:
fonte
ls
saída e usandofind
exargs
juntos da maneira errada. Se você combinarfind
exargs
eu recomendo que você use as opçõesfind
s-print0
e, consequentemente,xargs
s-O
. Leia sobre Como usar a localização para obter mais informações sobre o assunto. Você também pode dar uma olhada e ler sobre por que a análise de ls é muito ruim.Este one-liner faz tudo o que eu penso:
fonte
Aqui está uma solução:
fonte