最も多くのファイル/ディレクトリを含む最初のレベルの上位50のディレクトリをお探しですか?

最も多くのファイル/ディレクトリを含む最初のレベルの上位50のディレクトリをお探しですか?

find最大ファイル数を含むディレクトリのリストを生成する方法。リストが最も高いものから低いものの順にソートされることを望みます。私はリストの深さが1レベルになることを望み、通常はファイルシステムの最上位でこのコマンドを実行します/

ベストアンサー1

更新:私は以下のすべてを行いました。これは素晴らしいですが、以下を使用してinodeでディレクトリをソートするより良い方法を見つけました。

du --inodes -S | sort -rh | sed -n \
        '1,50{/^.\{71\}/s/^\(.\{30\}\).*\(.\{37\}\)$/\1...\2/;p}'

同じファイルシステムを維持するには、次のようにします。

du --inodes -xS

以下は、出力のいくつかの例です。

15K     /usr/share/man/man3
4.0K    /usr/lib
3.6K    /usr/bin
2.4K    /usr/share/man/man1
1.9K    /usr/share/fonts/75dpi
...
519     /usr/lib/python2.7/site-packages/bzrlib
516     /usr/include/KDE
498     /usr/include/qt/QtCore
487     /usr/lib/modules/3.13.6-2-MANJARO/build/include/config
484     /usr/src/linux-3.12.14-2-MANJARO/include/config

今LSで:

何人かの人々は最新のcoreutilsを持っておらず、--inodesオプションが利用できないと言いました。したがって、これはlsです。

sudo ls -AiR1U ./ | 
sed -rn '/^[./]/{h;n;};G;
    s|^ *([0-9][0-9]*)[^0-9][^/]*([~./].*):|\1:\2|p' | 
sort -t : -uk1.1,1n |
cut -d: -f2 | sort -V |
uniq -c |sort -rn | head -n10

これにより、次のコマンドとほぼ同じ結果が得られますdu

後ろ:

15K     /usr/share/man/man3
4.0K    /usr/lib
3.6K    /usr/bin
2.4K    /usr/share/man/man1
1.9K    /usr/share/fonts/75dpi
1.9K    /usr/share/fonts/100dpi
1.9K    /usr/share/doc/arch-wiki-markdown
1.6K    /usr/share/fonts/TTF
1.6K    /usr/share/dolphin-emu/sys/GameSettings
1.6K    /usr/share/doc/efl/html

LS:

14686   /usr/share/man/man3:
4322    /usr/lib:
3653    /usr/bin:
2457    /usr/share/man/man1:
1897    /usr/share/fonts/100dpi:
1897    /usr/share/fonts/75dpi:
1890    /usr/share/doc/arch-wiki-markdown:
1613    /usr/include:
1575    /usr/share/doc/efl/html:
1556    /usr/share/dolphin-emu/sys/GameSettings:

私はincludeプログラムが最初にどのディレクトリを見るかによって異なります。なぜなら、それらは同じファイルであり、ハードリンクされているからです。上記と同じ内容です。私が間違っているかもしれませんが、訂正を歓迎します...

基本的な方法は、ls各ファイル名をそのファイルを含むディレクトリ名に変更することです。それからsed.それ以来……まあ、私自身も少し混乱します。ここからわかるように、ファイル数を正確に数えていると確信しています。

% _ls_i ~/test
> 100 /home/mikeserv/test/realdir
>   2 /home/mikeserv/test
>   1 /home/mikeserv/test/linkdir

Dudemore

% du --version
> du (GNU coreutils) 8.22

テストディレクトリを作成します。

% mkdir ~/test ; cd ~/test
% du --inodes -S
> 1       .

いくつかの子供のカタログ:

% mkdir ./realdir ./linkdir
% du --inodes -S
> 1       ./realdir
> 1       ./linkdir
> 1       .

ファイルを作成します。

% printf 'touch ./realdir/file%s\n' `seq 1 100` | . /dev/stdin
% du --inodes -S
> 101     ./realdir
> 1       ./linkdir
> 1       .

いくつかのハードリンク:

% printf 'n="%s" ; ln ./realdir/file$n ./linkdir/link$n\n' `seq 1 100` | 
    . /dev/stdin
% du --inodes -S
> 101     ./realdir
> 1       ./linkdir
> 1       .

ハードリンクを見る:

% cd ./linkdir
% du --inodes -S
> 101

% cd ../realdir
% du --inodes -S
> 101

個別に計算されますが、ディレクトリ内の1レベル上です。

% cd ..
% du --inodes -S
> 101     ./realdir
> 1       ./linkdir
> 1       .

次に、以下から実行スクリプトを実行します。

> 100     /home/mikeserv/test/realdir
> 100     /home/mikeserv/test/linkdir
> 2       /home/mikeserv/test

そしてGraemeの言葉は:

> 101 ./realdir
> 101 ./linkdir
> 3 ./

したがって、これはインデックスノードを計算する唯一の方法はインデックスノードを使用することです。そして、ファイルの数を数えることは、inodeの数を数えることを意味するので、inodeを2回カウントすることはできません。ファイルを正確に計算するために、inodeを複数回計算することはできません。

古い:

私はこれがより速く、移植性があることがわかりました。

sh <<-\CMD
    { echo 'here='"$PWD"
        printf 'cd "${here}/%s" 2>/dev/null && {
                set -- 
                for glob in ".[!.]*" "[!.]*" ; do
                    set -- $glob "$@" && 
                        [ -e "./$1" ] || shift
                done    
                printf "%%s\\t%%s\\n" $# "$PWD"
        }\n' $( find . -depth -type d 2>/dev/null )
    } | . /dev/stdin |
    sort -rn | 
    sed -n \
        '1,50{/^.\{71\}/s/^\(.\{30\}\).*\(.\{37\}\)$/\1...\2/;p}'
CMD

-execすべてのディレクトリに対して必要はありません。ただ1つのshellプロセスと1つのfind。ルートディレクトリに行って確認してください。set -- $glob.hiddencd

以下は私の実行結果の例です/usr

14684   /usr/share/man/man3
4322    /usr/lib
3650    /usr/bin
2454    /usr/share/man/man1
1897    /usr/share/fonts/75dpi
...
557     /usr/share/gtk-doc/html/gtk3
557     /usr/share/doc/elementary/latex
539     /usr/lib32/wine/fakedlls
534     /usr/lib/python2.7/site-packages/bzrlib
500     /usr/lib/python3.3/test

また、sed一番下の項目を使用して上位50件の結果に整えました。headもちろん、より高速ですが、必要に応じて各行をトリミングすることもできます。

...   
159     /home/mikeserv/.config/hom...hhkdoolnlbekcfllmednbl/4.30_0/plugins
154     /home/mikeserv/.config/hom...odhpcledpamjachpmelml/1.3.11_0/js/ace
...

もちろん粗雑ですが、アイデアです。私が使用するもう一つの粗い方法は、およびダンプすること2>stderrです。ルートアクセスなしでは読み取れないディレクトリの権限エラーを表示するよりもきれいです。おそらくこれをとして指定する必要があります。findcd2>/dev/nullfind

いいですね。だから私はシェルグローブを次のように修正しました:

for glob in ".[!.]*" "[!.]*" ; do
    set -- $glob "$@" && 
        [ -e "./$1" ] || shift
done    

実際、これを行う方法について質問しようとしましたが、質問のタイトルを入力すると、サイトで次のことがわかりました。おすすめに関する質問ご覧のとおり、スティーブンは計量。だからこれは非常に便利です。確かに、[^.],よく支えられながらもいいえ!bang.ポータブル、Stephenのコメントで見つけたものを使用する必要があります。

それにもかかわらず、単に隠されたファイルをインポートするだけでは不十分です。したがって、setpositionでリテラルを検索したくない場合は、2回実行する必要があります$glob。それでもパフォーマンスにはまったく影響を与えないようで、ディレクトリ内のすべてのファイルを確実に追加します。

おすすめ記事