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つのsh
ellプロセスと1つのfind
。ルートディレクトリに行って確認してください。set -- $glob
.hidden
cd
以下は私の実行結果の例です/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
です。ルートアクセスなしでは読み取れないディレクトリの権限エラーを表示するよりもきれいです。おそらくこれをとして指定する必要があります。find
cd
2>/dev/null
find
いいですね。だから私はシェルグローブを次のように修正しました:
for glob in ".[!.]*" "[!.]*" ; do
set -- $glob "$@" &&
[ -e "./$1" ] || shift
done
実際、これを行う方法について質問しようとしましたが、質問のタイトルを入力すると、サイトで次のことがわかりました。おすすめに関する質問ご覧のとおり、スティーブンは計量。だからこれは非常に便利です。確かに、[^.],
よく支えられながらもいいえ!bang.
ポータブル、Stephenのコメントで見つけたものを使用する必要があります。
それにもかかわらず、単に隠されたファイルをインポートするだけでは不十分です。したがって、set
positionでリテラルを検索したくない場合は、2回実行する必要があります$glob
。それでもパフォーマンスにはまったく影響を与えないようで、ディレクトリ内のすべてのファイルを確実に追加します。
答え2
GNUツールの使用:
find / -xdev -type d -print0 |
while IFS= read -d '' dir; do
echo "$(find "$dir" -maxdepth 1 -print0 | grep -zc .) $dir"
done |
sort -rn |
head -50
これは2つのfind
コマンドを使用します。最初はディレクトリを探し、それをwhile
各ディレクトリに対して次のルックアップを実行するループに渡します。 2番目のエントリは、最初のレベルのすべてのサブファイル/ディレクトリのgrep
計算中に一覧表示されます。grep
同等の項目がないため、2番目の照会で使用できます。これにより、改行文字を含むファイル名が2回カウントされるのを防ぐことができます(たとえnoを使用しても大きな違いはありません)。-print0
wc
-z
wc
-print0
2番目の結果はfind
引数に配置されるため、echo
ディレクトリ名とディレクトリ名を同じ行に簡単に配置できます($(..)
構造体は自動的に末尾の改行文字を切り捨てますgrep
)。その後、行は数字順に並べ替えられ、最大50個の数字が表示されますhead
。
これには、マウントポイントの最上位ディレクトリも含まれます。この問題を解決する簡単な方法は、バインドマウントを使用してからマウントされたディレクトリを使用することです。これを行うには:
sudo mount --bind / /mnt
より移植可能な解決策は、ディレクトリごとに異なるシェルインスタンスを使用することです。ここ):
find / -xdev -type d -exec sh -c '
echo "$(find "$0" | grep "^$0/[^/]*$" | wc -l) $0"' {} \; |
sort -rn |
head -50
出力例:
9225 /var/lib/dpkg/info
6322 /usr/share/qt4/doc/html
4927 /usr/share/man/man3
2301 /usr/share/man/man1
2097 /usr/share/doc
2097 /usr/bin
1863 /usr/lib/x86_64-linux-gnu
1679 /var/cache/apt/archives
1628 /usr/share/qt4/doc/src/images
1614 /usr/share/qt4/doc/html/images
1308 /usr/share/scilab/modules/overloading/macros
1083 /usr/src/linux-headers-3.13-1-common/include/linux
1071 /usr/src/linux-headers-3.13-1-amd64/include/config
847 /usr/include/qt4/QtGui
774 /usr/include/qt4/Qt
709 /usr/share/man/man8
616 /usr/lib
611 /usr/share/icons/oxygen/32x32/actions
608 /usr/share/icons/oxygen/22x22/actions
598 /usr/share/icons/oxygen/16x16/actions
579 /usr/share/bash-completion/completions
574 /usr/share/icons/oxygen/48x48/actions
570 /usr/share/vim/vim74/syntax
546 /usr/share/scilab/modules/m2sci/macros/sci_files
531 /usr/lib/i386-linux-gnu/wine/wine
530 /usr/lib/i386-linux-gnu/wine/wine/fakedlls
496 /etc/ssl/certs
457 /usr/share/mime/application
454 /usr/share/man/man2
450 /usr/include/qt4/QtCore
443 /usr/lib/python2.7
419 /usr/src/linux-headers-3.13-1-common/include/uapi/linux
413 /usr/share/fonts/X11/misc
413 /usr/include/linux
375 /usr/share/man/man5
374 /usr/share/lintian/overrides
372 /usr/share/cmake-2.8/Modules
370 /usr/share/fonts/X11/75dpi
370 /usr/share/fonts/X11/100dpi
356 /usr/share/icons/gnome/24x24/actions
356 /usr/share/icons/gnome/22x22/actions
356 /usr/share/icons/gnome/16x16/actions
353 /usr/share/icons/gnome/48x48/actions
353 /usr/share/icons/gnome/32x32/actions
341 /usr/lib/ghc/ghc-7.6.3
326 /usr/sbin
324 /usr/share/scilab/modules/compatibility_functions/macros
324 /usr/share/scilab/modules/cacsd/macros
320 /usr/share/terminfo/a
319 /usr/share/i18n/locales
答え3
KDirStatのようなものを使用するとどうなりますか?もともとはKDE用に書かれていましたが、GNOMEでもうまく機能します。 GUIでは、ファイル/ディレクトリの数とそれぞれの使い方を最もよく見ることができます。
答え4
これにはzsh
glob修飾子が必要です。
print -rC1 -- **/*(ND/nOe['(){REPLY=$#;} $REPLY/*(NDoN)'][1,50])
print -rC1 --
:s列のprint
パラメータr
1
C
**/*
:recursive wildcard: 任意数のサブディレクトリにあるすべてのファイル(N...)
:glob修飾子はglob拡張をさらに限定します。N
:N
ウルグロップ。一致するものがなくても文句はありません。D
:D
オーグロップ。また、ファイルを隠すことも検討してください。nOe[code]
:評価額に基づいて逆順に注文しますO
。n
e
code
- ここのコードは、引数の数を格納する匿名関数に拡張子を渡して、ディレクトリ内
$REPLY
のファイルの数を設定します。$REPLY/*(NDoN)
$REPLY
[1,50]
:最初の50個のみが返されます。