X日より古いファイルを検索し、サイズ別に出力します


8

私は数日より古いファイルを取得し、すべての情報(サイズ、フルパスなど-によって提供されるものと同様のものls)を含むサイズに基づいて降順で一覧表示しようとしています。

私は古いファイルを見つけることができますが:

find . -mtime +10

必要な情報を一覧表示できません。


ディストリビューションとシェルの情報を追加してください
2015

@lese:AIX 6.1; while echo $ SHELL-> / usr / bin / ksh
user148335

これはXYProblemのように聞こえます...本当に、あなたが尋ねるように、サイズ順にすべてのファイルが必要ですか?または、(より可能性が高い)「古い」(> 10日)ファイルを探して十分な大きさを探している場合、たとえば、スペースを節約するために削除できるファイルを決定するには、最大200ファイルが必要ですか。後者の場合、AIXを使用しているため、GNUツールがない可能性があるため、find(10日を超えるすべてのファイルを出力)とawk(上位200の最大ファイルを配列に保持し、順に出力する)の組み合わせが最適です。最善策
Olivier Dulac

回答:


8

ファイルパスに改行文字が含まれていない場合:

find . -mtime +10 -printf "%s %n %m %u %g %t %p" \( \
  -type l -printf ' -> %l\n' -o -printf '\n' \) | sort -k1,1 -n

findマニュアルのセクションを参照してくださいActions

  • %s バイト単位のファイルのサイズ。
  • %nファイルへ のハードリンクの数。
  • %m ファイルの許可ビット(8進数)。
  • %u ファイルのユーザー名、またはユーザーに名前がない場合は数値のユーザーID
  • %g ファイルのグループ名、またはグループに名前がない場合は数値のグループID
  • %t C ctime関数によって返された形式でのファイルの最終変更時刻。
  • %p ファイルの名前。
  • %lシンボリックリンクの オブジェクト(ファイルがシンボリックリンクでない場合は空の文字列)。

ところで:POSIX findマニュアルは上記のアクションのほとんどを指定していないことに注意してください。


1
それは言う:検索:0652-017 -printfは有効なオプションではありません。
user148335

私にとってこれは機能し、かなりきれいな解決策のようです+1
2015

@ user148335、あなたはあなたが実行しているLinuxディストリビューションに言及していませんでした。POSIXのfind仕様に限定されているようですが、これはかなり限定されています。
patryk.beza

1
@ patryk.beza私はあなたがuser148335と話していたと思います
lese

AIX 6.1; while echo $ SHELL-> / usr / bin / ksh
user148335

4

このコマンドは、findおよびのPOSIX機能のみを使用しますls

find . -type f -mtime +10 -exec ls -lS {} +

ただし、プライマリと一致する現在のディレクトリ(または再帰的にサブディレクトリ)に非常に多数のファイルがある場合は、複数回呼び出す可能性があります。ls-mtime +10

lsもちろん、それが複数回呼び出される場合、ソートは各ls実行内でのみ行われ、複数の実行では行われません。

それでも、妥当な数のファイルについては、これがおそらく最善の策です。


更新されたバージョンは、名前にスペースが含まれていても壊れません
Miguel G

1
ls引数が1つだけ渡されている場合、それに対して実行できる並べ替えはほとんどありません。の+代わりに;、それはより良いでしょうが、ls多くのファイルがある場合、それでも数回呼び出されることになるかもしれません。
ステファンChazelas

2
これは私が与えたコマンドとまったく同じなので、それに合わせて与えたであろう説明文を追加しました。
ワイルドカード2016年

3

zsh

ls -ldrS -- **/*(m+10)

または、二重ソートを回避するには(zshによる名前とlsによるサイズ):

ls -ldrS -- **/*(m+10oN) # disable zsh sorting

または(ソートされていない場合のlsサポートの場合-U):

ls -ldU -- **/*(m+10oL) # disable ls sorting and have zsh sort by size

D隠しファイルも表示したい場合は、グロブ修飾子を追加します。


ユーザー名とグループ名にスペースが含まれている場合、これは機能しますか?
roaima

@roaima、はい。なぜそうならないのですか?E2BIGで壊れる可能性がありますzargs。これは、を使用して回避できます。
ステファンChazelas

あなたがそれを提供したので、私はそれが大丈夫だと思ったが、私は尋ねる必要があった:-)
roaima

1

私はあなたが次のようなことをすることができると思います:

find . -type f -mtime +10 -print0 | sort -n -r -k1 | while IFS= read -r -d $'\0' line; do
    #echo "$line"
    ls -lS "$line"    
done

コマンドの-Sパラメータに注意してくださいls

-Sファイルサイズで並べ替え


メッセージのために-d $ '\ 0'を削除した後:$ \ 0:これは出力を取得するために管理した識別子ではありませんが、ファイルはサイズに基づいて降順で書き込まれません
user148335

の下のディレクトリに遭遇すると壊れます/home/phphil。試してみるls -ld ...
roaima

@Roaima、find . -type f代わりに使用するのはどうですか?
2015

@leseコードを変更しましたが、コマンドはすべてのサブフォルダーから各ファイルを2回スローするようです。例
user148335

find ... -type f-dフラグを追加するのと同じように機能しますls
roaima

1

これを試して:

find ./ -type f -mtime +10 -exec ls -ln {} \; | sort -r -k 5 -g

-nオプションを使用すると、lsはユーザー名とグループ名をリストせず、代わりにuidとgidをリストするので問題ありません
dervishe

0

より簡単なワンライナーの場合は、findオプションを使用できます-ls。ほとんどの場合、ファイルサイズはリストされた情報の7番目の列に表示されます(そう7でない場合は、必要に応じてコマンドの最後で変更してください)。

find . -type f -mtime +10 -ls | sort -n -r -k7

0

別のバリエーションは、使用することです:

  • 検索(一致するファイルを見つけるため)
  • du(KBでファイルサイズを表示)
  • sort -n -r(降順でショートする)

コマンドは次のとおりです。

find . -type f -mtime +10 -exec du -k {} \; | sort -n -r
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.