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_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 ofensa, pessoal - eu também usei ls
antes. Mas realmente não é seguro.
Editar:Novofind_date_sorted
com 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: Om
para 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 -R
opçã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 ]