特定のディレクトリで最大20個のファイルを表示しようとしています。すべてのサブディレクトリを含めたいのですが、実際のディレクトリ自体は含めたくありません。 (私はファイルだけを望んでいます。)私はこれを行う方法を見つけようとしましたが、オンラインで見つけたソリューションのどれも私が使用しているUnixバージョンでは動作しません。
これまで私はこれを持っています:
find /dir -type f -exec ls -al {} \; | sort -nr | head -n 20 du -a -g /dir/ | sort -n -r | head -n 20
Riotは以下のリストを提供しました。
file1.txt
file1.txt
file1.txt
file2.txt
など。 2番目のコマンドは次のようになります。
500 \path\
250 \path\to\
100 \path\to\directory\
など。私が探している結果は次のとおりです。
500 \path\file1.txt
250 \path\to\file2.txt
100 \path\to\directory\file3.txt
など。問題に対して次の回避策を試しました。
- 再帰的に最大のファイルを見つける
- https://stackoverflow.com/questions/12522269/how-to-find-the-largest-file-in-a-directory-and-its-subdirectories
また、このチュートリアルに従ってください。
答え1
find dir/ -type f -exec du -a {} + | sort -nr | head -n 20
答え2
zsh
シェルのワイルドカードパターン
/dir/**/*(.DOL[1,20])
ディレクトリ内または下の最大20個のファイルに展開されるパス名/dir
(隠された名前も考慮され、シンボリックリンクファイルは無視されます)。
glob修飾子のさまざまな部分は、次のことを(.DOL[1,20])
意味します。
.
:一般ファイルのみが考慮されます。D
dotglob
:隠された名前のファイルも考慮してください(例:inの効果bash
)。OL
:結果をファイルサイズで降順に並べ替えます(O
=降順、o
=昇順ではありません。L
=「長さ」)。[1,20]
:globで展開された20番目の要素を返します。
この**
パターンは「再帰的に」一致するため、それ自体はディレクトリ内または下のすべての名前/dir/**/*
と一致します。/dir
以下と組み合わせて使用してくださいls
。
ls -l -f /dir/**/*(.DOL[1,20])
表示されたリストがソートされないようにするには、-f
withを使用する必要があります。ls
またはdu
ファイルを呼び出します。
du /dir/**/*(.DOL[1,20])