Python、PowerShell、C#、または Go を使用してディレクトリ内のアイテムをサイズの降順で並べ替える

Patricia Arquette
リリース: 2024-11-08 08:34:02
オリジナル
329 人が閲覧しました

ファイルでもフォルダーでも、ディレクトリ内のすべての項目をサイズの降順に並べ替える単純なプログラムです。

オペレーティング システムはディレクトリを参照するときにディレクトリの内容の合計サイズを計算しないため、グラフィカル ファイル ブラウザを使用しているかコマンド ラインを使用しているかにかかわらず、ディレクトリ内の項目をサイズの降順で並べ替えるのは、思っているほど簡単ではありません。木。この記事では、ほとんどのオペレーティング システムでこの問題を解決する完全な動作プログラムを提供します。

問題

おそらく次のようなおなじみのものを見つけるでしょう:

仕事であれ、個人的なプロジェクトであれ、私は親ディレクトリ (たとえば Projects というディレクトリ) を作成し、そこに個々のプロジェクトのすべてのコンテンツを保存することで、デジタル アセットを整理するのが好きです。プロジェクトが小さく、多くのコンテンツが含まれていない場合は、単一のファイル (通常はテキスト ファイル) を使用します。プロジェクトにさらに多くのコンテンツ (テキスト ファイルやいくつかのスクリーンショットなど) が含まれる場合は、そのプロジェクト用のフォルダーを作成し、そこに関連するすべてのアセットを配置します。したがって、私の観点からすると、単一のテキスト ファイルとフォルダーは、それぞれがプロジェクトを表すという意味で同等です。唯一の違いは、フォルダーがより大きなプロジェクトを表し、より多くのものを含むことです。

時々、自分のプロジェクトのうちどれが現在最大で、どれが最も多くのものを含んでいるかを確認したいことがあります。これは通常、特定の分野にしばらく取り組んでいないために発生します。そのため、その分野に戻ったときに、どのプロジェクトに最も多くのコンテンツが含まれているかを確認したいと考えます。私の推論は、最も多くのコンテンツを含むプロジェクトが最も完成度が高いはずであり、したがって、おそらくそれが最も簡単に完了するので、最初に作業を開始する必要があるということです。

たとえば、次の内容を含むディレクトリについて考えてみましょう:

Name Type Size
Huge Project.txt File 2.6KB
Larger Project Folder 1.07KB
0 - Tiny Project Folder 0KB
Basic Project.txt File 0.36KB
Big Project.txt File 2.11KB

上記のディレクトリをサイズの降順で並べ替えると、次のように出力されます。

Huge Project.txt        2.6KB
Big Project.txt 2.11KB
Larger Project  1.07KB
Basic Project.txt       0.36KB
0 - Tiny Project        0KB
ログイン後にコピー
ログイン後にコピー

ただし、これは、Windows、Mac、Linux のグラフィカル ファイル ブラウザで [サイズ] 列ヘッダーをクリックしたときに表示されるものではありません。

Sort Items in a Directory by Descending Size Using Python, PowerShell, C#, or Go

Windows ファイル エクスプローラー - ファイルはサイズの降順で並べ替えられ、フォルダーはその下にアルファベットの昇順で表示されます。

マック

Sort Items in a Directory by Descending Size Using Python, PowerShell, C#, or Go

MacOS Finder - ディレクトリの内容は Windows と同じように並べ替えられます。

Linux

Sort Items in a Directory by Descending Size Using Python, PowerShell, C#, or Go

Linux (Ubuntu) ファイル アプリ - フォルダーとファイルは個別に正しく並べ替えられます。最初にフォルダー、次にファイルです。したがって、リストの最初に表示される項目は、実際にはディレクトリ内で最大の項目ではありません。

コマンド ラインを使用すると、目的の出力に多少近い出力が得られますが、完全に正しいわけではありません。

ディレクトリ /b /o:-d

出力:

Larger Project
0 - Tiny Project
Huge Project.txt
Big Project.txt
Basic Project.txt

ログイン後にコピー
ログイン後にコピー

MacとLinux

Mac や Linux などの UNIX ベースのシステムでは、ディレクトリの内容を並べ替えるためのさまざまなコマンドの組み合わせがあります。ほとんどの場合、du、sort、ls の使用が必要になります。オンラインで見つけた他の例では、find と grep も同様に混合しました。

私が試したものは次のとおりです:

デュ |選別

du -a -h --max- Depth=1 |並べ替え -hr

出力:

32K     .
8.0K    ./Larger Project
8.0K    ./0 - Tiny Project
4.0K    ./Huge Project.txt
4.0K    ./Big Project.txt
4.0K    ./Basic Project.txt

ログイン後にコピー
ログイン後にコピー

ls

ls コマンドで -S スイッチを使用すると、まさに私が探していること、つまり項目をサイズの降順で並べ替えることができるはずです。

ls -S

出力:

'0 - Tiny Project'  'Larger Project'  'Huge Project.txt'  'A - Big Project.txt'  'Basic Project.txt'
ログイン後にコピー
ログイン後にコピー

出力はオフのままです。 -l (長い) スイッチを追加してみました。

ls -ls

出力:

total 20
drwx---r-x 2 admin admin 4096 Sep 20 21:49 '0 - Tiny Project'
drwx---r-x 2 admin admin 4096 Sep 20 21:49 'Larger Project'
-rw-rw-r-- 1 admin admin 2667 Sep 20 21:49 'Huge Project.txt'
-rw-rw-r-- 1 admin admin 2164 Sep 20 21:49 'Big Project.txt'
-rw-rw-r-- 1 admin admin  368 Sep 20 21:49 'Basic Project.txt'
ログイン後にコピー

予想どおり、出力にはより詳細な情報が含まれていますが、並べ替え順序は以前と同じです。

根本的な原因

さまざまなコマンドの出力では望ましい結果が得られませんが、問題の根本原因が明らかになります。ディレクトリ ツリーを参照するとき、オペレーティング システムは、フォルダを再帰してコンテンツの合計サイズを計算しません。代わりに、すべてのフォルダーが同じ固定サイズを持つものとして扱われます。通常、これはファイル システムの最小ブロック サイズで、通常は 4096 バイト、4KB です。

解決

この問題を解決する無料ツールは少なくとも十数個はあるはずですが、正直に言うと、私は調べもしませんでした。同じことを行うスクリプト/プログラムを書いてここで共有するほうが簡単で、肥大化も少なく、できれば他の人にも役立ち、間違いなくもっと楽しいと感じました。

もう十分長く悩んでしまいました。コードは次のとおりです:

パイソン

Huge Project.txt        2.6KB
Big Project.txt 2.11KB
Larger Project  1.07KB
Basic Project.txt       0.36KB
0 - Tiny Project        0KB
ログイン後にコピー
ログイン後にコピー

パワーシェル

Larger Project
0 - Tiny Project
Huge Project.txt
Big Project.txt
Basic Project.txt

ログイン後にコピー
ログイン後にコピー

Cシャープ

32K     .
8.0K    ./Larger Project
8.0K    ./0 - Tiny Project
4.0K    ./Huge Project.txt
4.0K    ./Big Project.txt
4.0K    ./Basic Project.txt

ログイン後にコピー
ログイン後にコピー

行く

'0 - Tiny Project'  'Larger Project'  'Huge Project.txt'  'A - Big Project.txt'  'Basic Project.txt'
ログイン後にコピー
ログイン後にコピー

4 つの実装にはいくつかの小さな違いがありますが、4 つすべてで使用される一般的なアプローチは同じです。

  1. 項目 (ファイルまたはフォルダー) の名前とサイズのキーと値のペアのコレクションを返す再帰関数を作成します。
  2. メイン関数またはブロックで、基本的な入力検証を実行し、ユーザーが有効なパスを指定した場合は、そのパスで再帰関数を実行します。
  3. 再帰関数の出力を値 (サイズ) で降順に並べ替えます。
  4. ソートされた出力をコンソールに出力します。出力される各行は形式に従います。項目名、タブ文字、項目サイズを 1024 で割って小数点第 2 位に四捨五入してキロバイト単位のサイズを取得し、その後にサイズ単位を示す「KB」が続きます。

使用法

コマンドラインで、ソートするディレクトリへのパスを最初のパラメータとして渡します。考えられるすべての例をリストするわけではありませんが、コードをコピーし、「ディレクトリ降順」の略称である dir_desc というファイル名と適切なファイル拡張子を付けて保存したものとして、いくつかの例を示します。

Mac または Linux での Python の使用:

python3 dir_desc.py <何らかのパス>

Windows での PowerShell の使用:

powershell -f dir_desc.ps1 <何らかのパス>

言語と実装の違い

  • Python と Go は、最初のコマンド ライン引数が args 配列の 2 番目の項目であるという点で、C やその他の C に似た言語に似ています。 .NET 言語、PowerShell および C# では、最初の引数は args 配列の最初の項目です。
  • PowerShell では、組み込みの Get-ChildItem (gci) および Measure-Object (measure) コマンドレットを使用すると、目的の結果をより簡単に実現できるため、別の再帰関数を作成する必要はありません。
  • Go では、キーと値のペア (マップ) のコレクションを値で並べ替えるには、他の言語よりも数行多くのコードが必要になります。これは、組み込みの並べ替え関数がマップではなく配列/スライスを操作するように設計されているためです。
  • Go では、浮動小数点数を小数点以下 X 桁に丸める処理は、数値を四捨五入する場合とは対照的に、fmt.Printf() 関数を使用して出力を印刷するときに処理されます。ちなみに、これは数学を使用せずに実行できます。 .Round() 関数。 C のバックグラウンドがある場合、これはおそらく直感的に理解できるでしょう。残りの人にとって、これは少し奇妙ですが、問題なく機能します。

私は Python でのオリジナルのアプローチを他のいくつかの言語に移植しました。その結果、3 つの主要なオペレーティング システムのそれぞれで少なくとも 1 つのバージョンが動作するはずです。

  • Mac および Linux: デフォルトで python3 インタープリターがインストールされている必要があります。そうでない場合は、Go バージョンを使用できます。一部の Linux システムには、Go をコンパイルできるバージョンの gcc がデフォルトでインストールされている場合がありますが、ほとんどのシステムはそうではないため、Go コンパイラーをダウンロードする必要があります。
  • Windows: PowerShell バージョンは、Windows 10 以降のシステムでそのまま動作します。古いシステムの場合は、おそらく C# バージョンの方が良い選択です。 Windows の組み込み C# コンパイラを使用してコードをコンパイルできます。

それで終わりです。もう一匹のヤクは毛を剃った。これがお役に立てば幸いです。

以上がPython、PowerShell、C#、または Go を使用してディレクトリ内のアイテムをサイズの降順で並べ替えるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!