rm60()( IFS=/; set -f; set $(
set +f; \ls -1drt ./*)
while shift &&
[ $# -gt 60 ]
do [ -d "${1%?.}" ] ||
rm "./${1%?.}" || exit
done
)
Isso funcionará para você. Ele excluirá os arquivos mais antigos no diretório atual até uma contagem de 60. Ele fará isso por analisando ls
robustamente e fará isso sem fazer nenhuma suposição sobre os seus nomes de arquivos - eles podem ter qualquer nome e não precisam ser nomeados por datas. Isso só funcionará para uma listagem do diretório atual e, no caso de você ter um POSIX ls
instalado (e não mascarado por alguma função maligna do shell, mas alias
es são cobertos) .
A solução acima aplica apenas uma divisão de shell muito básica em alguns nomes de caminho muito básicos do Unix. Isso garante que ls
liste todos os arquivos não pontuados no diretório atual, um por linha, como:
./oldestfile
./second-oldestfile
Agora, qualquer um desses pode ter novas linhas entre eles também, mas isso não seria um problema. Porque nesse caso eles seriam listados como:
./oldest
file
./s
econd
old
est
file
./third
... e assim por diante. E as novas linhas não nos incomodam de qualquer maneira - porque nós não nos separamos delas. Por que nós? Estamos trabalhando com nomes de caminho, devemos dividir no delimitador de caminho, e é isso que fazemos: IFS=/
.
Agora isso funciona um pouco estranho. Acabamos com uma lista de argumentos que se parece com isso:
<.> <file1\n.> <file2\n.> ... <filelast>
... mas isso é realmente muito bom para nós, porque podemos atrasar nossos argumentos sendo tratados pelo shell como arquivos (ou, no caso, queremos evitar, symlinks) até que nós ' está bastante pronto para rm
deles.
Então, assim que tivermos nossa lista de arquivos, tudo o que temos a fazer é shift
eliminar nosso primeiro argumento, verificar se atualmente temos mais de 60 argumentos, provavelmente recusar rm
um diretório filho (embora, é claro, isso é completamente com você) , e de outra forma rm
nosso primeiro argumento menos seus dois últimos caracteres. Nós não temos que nos preocupar com o último último argumento - que não tem o período acrescentado - porque nós nunca chegamos lá, e ao invés disso paramos aos 60. Se nós chegarmos até aqui uma iteração, então nós apenas tentamos novamente e passamos o loop da lista de argos até que tenhamos podado para nossa satisfação.
Como isso quebra? Não, ao meu conhecimento, mas eu permiti - se a qualquer momento ocorrer um erro inesperado, o loop será interrompido e a função retornará diferente de 0.
E assim ls
pode fazer sua listagem para você no diretório atual sem nenhum problema. Você pode permitir que ele classifique seus argumentos para você, contanto que você possa delimitá-los de maneira confiável. É por essa razão que isso não funcionará como escrito para nada além do diretório atual - mais de um delimitador em um pathstring exigiria outro nível de delimitação, o que poderia ser feito considerando-o duplamente para todos, exceto o último em campos NUL. , mas eu não me importo de fazer isso agora.