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 '/.*/'。 1つもない場合は、引き続き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はオプションですが痛いです。

1つの方法はソートすることです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分、以前のファイルの場合は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

この回答全体では、ファイル名に改行文字や印刷できない文字が含まれていないとします。

おすすめ記事