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.