ls -t1 /mnt/dwh/ftp/dwh_ftp_cbs/ARLOGS/ | tail -n +22 | xargs rm -f
Não funcionará porque a saída de ls
incluirá apenas os nomes dos arquivos, não o caminho completo. Ele também ignora arquivos cujo nome começa com .
.
cd /mnt/dwh/ftp/dwh && ls -At1 | tail -n +21 | xargs rm -f --
resolveria isso, mas você ainda teria problemas com nomes de arquivos que contêm espaços em branco ou nova linha ou apóstrofo ou barras invertidas ou aspas duplas (e possivelmente nomes de arquivos com bytes que não formam caracteres válidos na localidade).
(export LC_ALL=C
cd /mnt/dwh/ftp/dwh && ls -At1 |
tail -n +21 |
sed 's/"/\"/g;s/.*/"&"/' |
xargs rm -f --
)
consertaria a maioria deles, mas você ainda teria um problema com nomes de arquivos contendo caracteres de nova linha. O problema é que a saída de ls -At1
não é pós-processável.
A saída de ls -Atd1 ./.* ./*
pode ser pós-processada (como os prefixos ./
indicam onde cada nome de arquivo é iniciado na saída, mas não facilmente), mas você corre o risco de atingir o limite do número de argumentos passados para um comando, passando a lista de nomes de arquivos para ls
assim.
O melhor seria usar um shell que possa fazer essa classificação em seus globs ou confiar nas extensões do GNU se o seu só precisa trabalhar em sistemas GNU:
cd /mnt/dwh/ftp/dwh &&
find . ! -name . -prune ! -type d -printf '%T@\t%peval "set -- $(COLUMNS=4294967295 ls -Atx --quoting-style=shell-always)"
if [ "$#" -gt 20 ]; then
shift 20
printf '%sls -t1 /mnt/dwh/ftp/dwh_ftp_cbs/ARLOGS/ | tail -n +22 | xargs rm -f
' "$@" | xargs -r0 rm -f --
fi
' |
tr 'cd /mnt/dwh/ftp/dwh && ls -At1 | tail -n +21 | xargs rm -f --
\n' '\n(export LC_ALL=C
cd /mnt/dwh/ftp/dwh && ls -At1 |
tail -n +21 |
sed 's/"/\"/g;s/.*/"&"/' |
xargs rm -f --
)
' |
sort -rn |
tail -n +21 |
cut -f 2- |
tr ' cd /mnt/dwh/ftp/dwh &&
find . ! -name . -prune ! -type d -printf '%T@\t%peval "set -- $(COLUMNS=4294967295 ls -Atx --quoting-style=shell-always)"
if [ "$#" -gt 20 ]; then
shift 20
printf '%s%pre%' "$@" | xargs -r0 rm -f --
fi
' |
tr '%pre%\n' '\n%pre%' |
sort -rn |
tail -n +21 |
cut -f 2- |
tr '%pre%\n' '\n%pre%' |
xargs -r0 rm -f
\n' '\n%pre%' |
xargs -r0 rm -f
Aqui, estamos excluindo o arquivo do tipo diretório , que afetará a numeração, mas provavelmente está mais próximo do que você deseja, pois não suponho que você queira remover diretórios. Se você deseja remover diretórios, remova o -type d
e adicione a opção -r
a rm
.
Ou:
%pre%
Ou use uma linguagem de programação genérica como perl
, python
, ruby
...