Encontre os detalhes da capacidade e o arquivo mais antigo no formato Busybox

1

Estou usando o Mobax e o Busybox está instalado nele. Eu posso obter com sucesso a porcentagem de capacidade, disponível, usada e usada do diretório e seus subdiretórios no Linux digitando:

clear && date && pwd && du --max-depth=1 -k | sort -nr | cut -f2 | xargs -d '\n' du -sh

e posso obter o arquivo mais antigo / mais antigo no Linux, que exibe a data, a hora e o nome do arquivo, digitando:

find -type f -printf '%T+ %p\n' | sort | head -n 1

No entanto, alguns argumentos nos comandos não podem ser traduzidos diretamente pelo Busybox. Como você traduz ou qual é a tradução desses comandos que podem ser lidos pelo Busybox?

    
por yologaming 26.07.2016 / 03:08

1 resposta

1

GNU du --max-depth=1 traduz diretamente para BusyBox du -d 1 . Não há equivalente de xargs -d ; você pode traduzir novas linhas para bytes nulos se xargs -0 for suportado.

du -d 1 -k | sort -nr | cut -f2 | tr '\n' '
tab="$(printf \t)"  # or a literal tab character
du -d 1 -k | sort -nr | while IFS= read -r line; do
  line="${line#*$tab}"
  du -sh -- "$line"
done
' | xargs -0 du -sh

O BusyBox tem muitas compilações para ajustar o compromisso entre tamanho e recursos. Se você não tiver du -d , poderá usar du | grep -v '/.*/' . Se você não tem du -h , tente e use kilobytes em todo lugar.

Sem xargs -0 , você pode usar um loop de shell.

ls -t | tail -n 1

Não há uma boa maneira de encontrar o arquivo mais antigo em uma árvore de diretórios sem ferramentas avançadas como zsh ou GNU find. Analisar a saída de ls -l é uma opção, mas é doloroso.

Uma abordagem é deixar ls fazer a classificação. Isso requer que o recurso de registro de data e hora seja incluído. Se for, obter o arquivo mais antigo no diretório atual é relativamente fácil:

set -f; IFS='
'
set -- $(find -type f -exec sh -c 'ls -t | tail -n 1' {} +)
ls -t -- "$@" | tail -n 1

Quando find está envolvido, isso fica mais complicado porque ls pode ser chamado várias vezes e a classificação só se aplica a cada chamada. O que você pode fazer é coletar todos os arquivos mais antigos por execução de ls e, em seguida, executar ls mais uma vez para classificá-los. Espero que você não precise de mais de dois níveis.

LC_ALL=C find -type f -exec ls -lne {} + |
sort -k4,4n -k 1,1M -k 2,2n -k 3,3 |
head -n 1

Como alternativa, se o seu ls tiver a opção -e para exibir registros de data e hora em um formato uniforme e seu sort tiver a opção -M para classificar por nome do mês, você poderá classificar sua saída:

LC_ALL=C find -type f -exec ls -lne {} + |
sed -e 's/^[^ ]* [ 0-9]*//' |
sed -e 's/^Jan/01/' -e 's/^Feb/02/' -e 's/^Mar/03/' -e 's/^Apr/04/' -e 's/^May/05/' -e 's/^Jun/06/' -e 's/^Jul/07/' -e 's/^Aug/08/' -e 's/^Sep/09/' -e 's/^Oct/10/' -e 's/^Nov/11/' -e 's/^Dec/12/' |
sed -e 's/^\(.. \) //' -e 's/^\(.. .. \) \([0-9][0-9]* \)//' |
awk -v y="$(date +%Y)" -v m="$(date +%m)" '$3 ~ /:/ {sub(/^.. .. ..:../, ($1 <= m ? y : y+1) " " $1 " " $2)} 1' |
sort | cut -d ' ' -f 4- |
head -n 1

Observe que, se vários arquivos tiverem um registro de data e hora no mesmo segundo, qual deles será uma questão de chance. Isso é inevitável se a granularidade do sistema de arquivos não ultrapassar os segundos de qualquer maneira.

Sem sort -M e especialmente sem ls -e , você precisa de muito mais massagens. Além disso, sem ls -e , a resolução de timestamps é baixa: um minuto para arquivos modificados nos últimos 6 meses, um dia para arquivos mais antigos. O que você obtém é um arquivo aleatório entre aqueles com o timestamp mais antigo, não necessariamente o mais antigo.

du -d 1 -k | sort -nr | cut -f2 | tr '\n' '
tab="$(printf \t)"  # or a literal tab character
du -d 1 -k | sort -nr | while IFS= read -r line; do
  line="${line#*$tab}"
  du -sh -- "$line"
done
' | xargs -0 du -sh

Observe que, em toda essa resposta, presumo que os nomes dos arquivos não contenham novas linhas ou caracteres não imprimíveis.

    
por 27.07.2016 / 02:11