Busybox 형식으로 용량 세부 정보 및 가장 오래된 파일 찾기

Busybox 형식으로 용량 세부 정보 및 가장 오래된 파일 찾기

저는 Busybox가 설치된 Mobax를 사용하고 있습니다. 다음을 입력하면 Linux에서 디렉터리와 해당 하위 디렉터리의 용량, 여유 공간, 사용률, 사용률을 성공적으로 얻을 수 있습니다.

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

다음을 입력하면 Linux에서 날짜, 시간 및 파일 이름을 표시하는 가장 오래된/가장 빠른 파일을 얻을 수 있습니다.

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

그러나 명령의 일부 매개변수는 Busybox에서 직접 변환할 수 없습니다. Busybox가 읽을 수 있는 이러한 명령을 어떻게 번역하거나 번역합니까?

답변1

GNU는 du --max-depth=1BusyBox로 직접 변환됩니다 du -d 1. 지원 xargs -d되는 경우 개행 xargs -0문자를 널 바이트로 변환할 수 있습니다 .

du -d 1 -k | sort -nr | cut -f2 | tr '\n' '\0' | xargs -0 du -sh

BusyBox에는 크기와 기능 간의 균형을 조정하기 위한 많은 컴파일이 있습니다. 그렇지 않은 경우에는 du -d사용할 수 있습니다 du | grep -v '/.*/'. 하나도 없으면 du -h계속 사용하고 모든 킬로바이트를 사용하십시오.

그렇지 않은 경우 xargs -0쉘 루프를 사용할 수 있습니다.

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

zsh 또는 GNU find와 같은 고급 도구가 없으면 디렉토리 트리에서 가장 오래된 파일을 찾을 수 있는 좋은 방법이 없습니다. 구문 분석된 출력 ls -l은 옵션이지만 고통스럽습니다.

한 가지 방법은 정렬하는 것입니다 ls. 이를 위해서는 타임스탬프 기능이 포함되어야 합니다. 그렇다면 현재 디렉터리에서 가장 오래된 파일을 가져오는 것이 비교적 쉽습니다.

ls -t | tail -n 1

여러 번 호출할 수 있고 순서는 각 호출에만 적용되므로 관련 되면 find더 복잡해집니다 . ls당신이 할 수 있는 일은 실행할 때마다 가장 오래된 파일을 모두 수집 ls한 다음 ls다시 실행하여 해당 파일을 정렬하는 것입니다. 두 개 이상의 레벨이 필요하지 않기를 바랍니다.

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

또는 타임스탬프를 일정한 형식으로 표시하는 옵션과 월 이름별로 정렬하는 옵션이 ls있는 경우 출력을 정렬할 수 있습니다.-esort-M

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

여러 파일에 동일한 초 내에 타임스탬프가 있는 경우 어떤 파일을 얻을지는 우연의 문제입니다. 파일 시스템의 세분성이 초보다 크지 않은 경우 이는 불가피합니다.

아니요 sort -M, 특히 아니요 ls -e. 마사지가 더 필요합니다. 또한 그렇지 않으면 ls -e타임스탬프의 해상도가 좋지 않습니다. 지난 6개월 이내에 수정된 파일의 경우 1분, 이전 파일의 경우 하루입니다. 당신이 얻는 것은 가장 오래된 타임스탬프를 가진 임의의 파일이며 반드시 가장 오래된 파일은 아닙니다.

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/^\(.. \) /\10/' -e 's/^\(.. .. \) \([0-9][0-9]* \)/\2\1/' |
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

이 답변 전체에서 파일 이름에 개행 문자나 인쇄할 수 없는 문자가 포함되어 있지 않다고 가정합니다.

관련 정보