日付で並べ替えられた{サイズ}より大きいファイルを一覧表示する


27

「現在のディレクトリにある20 MBを超える最新のファイルのトップ10をリストする」という問題を解決したいと思います。

ls私は行うことができます。

ls -Shal |head

上位10個の最大ファイルを取得します。

ls -halt |head

最新のトップ10ファイルを取得する

findでできること:

find . -size +20M

現在のディレクトリ(および望ましくないサブディレクトリ)にある20MBを超えるすべてのファイルを一覧表示するには。

特定のサイズを超える最新のファイルのトップ10をリストする方法はありますlsか?

回答:


24

の「現在のディレクトリ」オプションはfindです-maxdepth 1。ニーズに合ったコマンドライン全体は次のとおりです。

find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -Shal | head

または

find . -maxdepth 1 -type f -size +20M -print0 | xargs -0 ls -halt | head

8

注:これはGNU-findで機能しますが、他のすべての検索では機能しません。

find . -maxdepth 1 -size +20M -printf "%T@ %f\n" | 
    sort -nr | head -n 20 | sed 's/[^ ]\+ //'

@Rajishのように起動しますが、printfコマンドfrom findを使用して出力形式を指定します。3時間関連のフォーマットがありますが、atimeが、ctimeをのmtimeは - %Tファイルのmtime用で、%Aかつ%C他のフォーマットのためのものです。

@エポックからの秒数でタイムフォーマットを指定することです。%fは、ファイル名、\n2つのファイル間の改行です。

次に、番号を逆順に並べ替えると、最も若いファイルが最初に表示され、で20行¹が取得されheadます。

最後に、sed時間情報を破棄するために使用されます。

¹)head行ごとに機能するため、名前に20を超える改行が含まれる単一のファイルは、少し珍しいですが禁止されていないため、最初の20の一致に属している場合、出力が破損する可能性があります。そのようなファイルがある場合は、それらを削除してください。名前を変更してください。多くの場合、単純なスクリプトでは問題になります。


1
file-lsコマンドを使用する場合、特殊文字はバックスラッシュでエスケープされた文字として出力されますfind . -maxdepth 1 -size +20M -printf "%T@ " -ls | sort -nr | head -n 20 | sed 's/[^ ]\+ //'。さらに、形式はのようになりls -l、EoghanMも指定され-lます。
マナトワーク

printf特定のGNUディストリビューションでのみ機能します。
-Brethlosze

%T+人間が読めるタイムスタンプを生成します。2018-11-06+13:37:54.4606466460これもsort(なしで-n)並べ替える
Ciro Santilli新疆改造中心法轮功六四事件

5

Zshのglob修飾子はこれを簡単にします。.修飾子のみを選択し、通常のファイル、Lm+2020MB以上のプラス1バイト長である選択ファイル。正確に20MBのファイルを含めるには、を使用しますL+20971519。次にom、変更時間を減らしてソート[1,10]し、最初の10個の一致に拡張を制限します。日付ごとにファイルを一覧表示-tするlsかどうかのオプションが引き続き必要です。または、他のコマンドにファイルを渡すことができます(最も若いものから)。最初に最も古いファイルを使用Omして別のコマンドにファイルを渡すには、を使用して変更時間を増やして並べ替え[-10,-1]、最後の10個の一致を抽出します。

ls -ltr -- *(.Lm+20om[1,10])
echo *(.Lm+20Om[-10,-1])

2

私はこれが問題を解決するより良い方法かもしれないと思います...

find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ | head

findが読み取り権限のないファイルにアクセスしようとしたときにエラーを取り除くには、追加することをお勧めします

find . -maxdepth 1 -type f -size +20M -exec ls -Shal {} \+ 2> /dev/null | head 

1

これは、ファイル名に埋め込まれた改行文字に関係なく、指定された10個のファイルのみを印刷します。ファイルシステムを使用しますinodes

cd "$1"
for i in $(find . -maxdepth 1 -type f -size +20M -printf "%T@\t%i\n" \ 
           | sort -nr | head | cut -f 2)
do
  ls -l "$(find . -inum $i)"
done

-1

すべての答えをありがとう。私が行ったことは次のとおりです。

ls -halt | grep "M " |head

20メガバイトではなく1メガバイト(および1ギガバイト未満)を優先しますが、覚えやすく、人間が読めるファイルサイズの要素を保持します。


4
あなたはすべきではないの出力を解析しようとするとls、それは何よりも、あなたのファイルの表示を示しています。単純なファイル名の場合、ほとんどの場合、出力はファイル名と同じですが、それに頼るべきではありません。
クリスダウン

確かにそれは確かですが、人間のユーザー(および出力が他の場所にパイプされない)に関しては、これは既知のシンプルなツールtldp.org/LDP/GNU-Linux- Tools-Summary / html / c1089.htm
EoghanM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.