ディレクトリの実容量をバイト表示

パピーを名犬にするための技、テクニック

モデレータ: 暇人, YoN, nyu

返信する
アバター
ルビー
記事: 1240
登録日時: 14/11/24(月) 12:12

ディレクトリの実容量をバイト表示

投稿記事 by ルビー »

ディレクトリをコピーして、コピーが正常に完了したのを調べたい時に、それぞれのファイル数とバイト単位の実容量を比べます。
同一であれば、二つのディレクトリの中身は同じと判断します。

Windowsでは、フォルダのプロパティで実容量のバイト表示が簡単にできるのですが、Linuxでは簡単にはできないようです。
ROX-Filerのプロパティは、ディスクのディレクトリの使用量が表示されますが、実容量は表示されません。
duでも取得できるのはディスクの使用量で、バイト単位で実用量を取得するのはできませんでした。

調べると、findとawkを組み合わせればできるようなので、自分で使いやすいように作ってみました。
長い事、使ってますが、不具合も無く、便利に使ってます。

コード: 全て選択

find $* -type f -printf "%s\n" | awk '
{sum += $1}
END {
    printf("%\047d files\n",NR)
    printf("%\047d byte\n",sum)
}'
ROX-Filerの新規作成で、/root/my-applications/binに、Scriptファイルを作成して、上記をコピペします。
ファイル名はコマンドと重ならければ、何でも良いですが、私はタイピングしやすいように、ds(directory size)としてます。

使い方は、端末で下記の様に入力します。

  ds hoge

ディレクトリの合計ファイル数、バイト単位の実容量を3桁のカンマ区切りで表示します。

  7,166 files
  6,416,318,064 byte

引数に複数のディレクトリ、ファイルでその合計を表示します。

  ds hoge kame neko.txt

ROX-FilerからShift+@(`)で、端末を開くと便利です。

以下は、他の詳しい説明です。
・ディレクトリの再帰処理
  ・シンボリックリンクは辿らない
・引数にファイルも可能
・引数無しは、カレントディレクトリ以下の容量表示
・引数にスペース入りディレクトリ名は不可
  ・ディレクトリ中にあるのは可能

追記
スペース入りディレクトリの指定方法。
1. ROX-Filerでスペース入りディレクトリを開き、Shift+@(`)を入力
2. スペース入りディレクトリがカレントの状態で端末が開くので、ds と入力

これで、スペース入りディレクトリ以下の容量が表示されます。
当然ながら、この方法では複数のディレクトリの指定はできません。

コマンドラインでスペース入りディレクトリを指定したい場合は、指定方法を下に書きましたので、こちらを参照してください。
viewtopic.php?f=13&t=3241#p25234

追記
スクリプトの末尾に改行を追加しました(取れていた為)。
動作に変わりはありません。

追記
ROX-Filer起動用の dsrox(directory size rox)を作りました。
なんちゃってGUI版です(^^;。
viewtopic.php?f=13&t=3241#p25258
最後に編集したユーザー ルビー [ 18/04/15(日) 21:36 ], 累計 5 回
アバター
タロ兵衛
記事: 875
登録日時: 08/07/08(火) 00:11
お住まい: よこはま
連絡する:

Re: ディレクトリの実容量をバイト表示

投稿記事 by タロ兵衛 »

pet化してみました。
下記より directory_size.pet をダウンロードして、クリックするとインストールできます。
パスが通っていますので、dsだけで起動します
アンインストールはパッケージマネージャからできます

http://sakurapup.com/mirror/ruby/
neo実験君こと次期メインマシン
Intel Core i5-8400 2.80GHz
xenialpup64 7.5+lang_pack_ja-xenial64e
アバター
ルビー
記事: 1240
登録日時: 14/11/24(月) 12:12

Re: ディレクトリの実容量をバイト表示

投稿記事 by ルビー »

タロ兵衛 さんが書きました:pet化してみました。
Thanks!
petにしてもらっても、使うのはコマンドラインと言うのが、あれな気もしますが(^^;。

ついでにですが、スペース入りのディレクトリは使えないと書きましたが、実は説明の手抜きなだけで、実際は使えます。
簡単に説明すると、? や * のワイルドカードを使って、スペース入りのディレクトリを指定すればOKです。
その際は、" で囲みます。

こんな風に説明がややこしくなって、とたんに難解な印象になってしまいます。
コマンドラインに詳しくない人でも、簡単に使えそうな感じの方が良いかなと思ったのと、自分ではスペース入りファイル名は使わない主義なので、使えないと言う事でいいかにしていました。

せっかくpetにしてもらった事だし、今度、時間がある時に、スペース入りディレクトリの指定の詳しい説明を書こうかなと思います。
アバター
ルビー
記事: 1240
登録日時: 14/11/24(月) 12:12

Re: ディレクトリの実容量をバイト表示

投稿記事 by ルビー »

スペース入りのディレクトリ名の指定方法です。

1. スペースの代わりにワイルドカードを使い、ディレクトリを指定する
2. ダブルクォート( " )で囲む

ワイルドカード
 ? クエスチョン  任意の1文字
 * アステリスク  0文字以上の任意の文字列

例として、ディレクトリが sakura pup browser の場合です。
カレントディレクトリの下にあるとします。
 1. ds "sakura?pup?browser"  ← ? の例
 2. ds "sakura*pup*browser"  ← * の例
 3. ds "sakura*"        ← * の例

3. が一番簡単そうですが、アステリスク指定の場合、似たような名前のディレクトリがあると、それも指定の対象に含まれるので、注意が必要です。

例えば、下記が全て当てはまります。
 sakura
 sakurayama
 sakura hana
 sakura pup browser

検索とは違い、確実にディレクトリを指定したいので、私なら 1. を使います。

あまり使わないと思いますが、ワイルドカードで、複数ディレクトリの一括指定も可能です。
ディレクトリ inu1 inu2 inu3 の場合、
 ds inu?

指定のディレクトリがスペース無しならば、ワイルドカード使用でも " で囲まなくてOKです。

一般的に、ファイル名にスペースが入ると面倒な事になるので、スペース入りの名前は使わない方が無難です。
やむをえず入ってしまった場合は、一時的に スペース文字を _(アンダースコア)に置き換えるなどした方が簡単かもしれません。
最後に編集したユーザー ルビー [ 18/04/09(月) 18:05 ], 累計 1 回
アバター
タロ兵衛
記事: 875
登録日時: 08/07/08(火) 00:11
お住まい: よこはま
連絡する:

Re: ディレクトリの実容量をバイト表示

投稿記事 by タロ兵衛 »

サーバーにreadme.htmlを入れて見ました。
内容は、このスレッドのURLだけですけど。
これで、この記事を知らない方でも使い方が分かると言うしかけ
他の方のミラーするときも入れておけば良いのかなと
(お試しに使ってしてしまってスミマセン)
neo実験君こと次期メインマシン
Intel Core i5-8400 2.80GHz
xenialpup64 7.5+lang_pack_ja-xenial64e
アバター
ミトじい
記事: 162
登録日時: 13/09/19(木) 08:43
お住まい: 埼玉県 K市 南O

Re: ディレクトリの実容量をバイト表示

投稿記事 by ミトじい »

便利なツール、毎度ありがとうございますm(_ _m)
ルビー さんが書きました:petにしてもらっても、使うのはコマンドラインと言うのが、あれな気もしますが(^^;。
私も最近モノグサになってきてマウスだけで済ませたいので、roxファイラの右クリックメニューで起動できるようにして、ありがたく使わせてもらってます

コード: 全て選択

#!/bin/sh

TARGETDIR="$@"

urxvt -T "ディレクトリの実容量(ルビー氏作)" -e sh -c "echo ${TARGETDIR};ds ${TARGETDIR};read line"
こんな感じのスクリプトを /root/my-applications/bin に ds4roxmenu として作成・実行可能にしておいて
1.roxファイラで適当なディレクトリを右クリックして「メニューをカスタマイズ」を選択
2.表示されたディレクトリに ds4roxmenu へのsymlinkを作成
3.解り易いようにsymlinkの名前を「実容量」に変更

これでroxファイラの右クリックメニューに「実容量」がでてくるので、マウスだけで使えるようになりました
また複数ディレクトリを選択マークして右クリックした時は「アプリに送る」を選択して表示されるメニューに「実容量」がでて、選択した複数ディレクトリの一括動作もOKでした

ただ、空白を含むディレクトリ名への対応はしてません
TARGETDIR のところでルビーさんがご指南くださった空白置き換えの処理を、スクリプト処理でゴニョゴニョすればできそうなんですけど、私の力量ですぐには… :oops:

ところで「実容量」って表現は日本語的には「器の大きさ」をあらわすような気がして、この場合「実占有量」の方が良いような気もするんですが、イマイチ語呂が悪いような気もして…
どうなんでしょうねぇ?
machine: PC-VN770WG1YW(customed) [4x intel core-i5 M460 2.53GHz, ram: 8GB]
main OS: bionic64-simple-r2 <- special thanks Mr. thinkpadnerd m(_ _)m
sub OS: linux mint, win10(Pro), win7(HP+SP1), android-x86, …
アバター
ルビー
記事: 1240
登録日時: 14/11/24(月) 12:12

Re: ディレクトリの実容量をバイト表示

投稿記事 by ルビー »

ROX-Filerを使った、スペース入りディレクトリの指定方法を、トップの記事に追加しました。

こちらは、ワイルドカードなどと言うややこしい物も使わないので、初心者でも簡単です。
複数ディレクトリの指定はできませんが、これで十分に思います。
ルビー さんが書きました:・引数無しは、カレントディレクトリ以下の容量表示
自分で書いておいて、すっかり忘れてました(^^;。
スクリプト作った当初は、スペース入りディレクトリなんてどうせ使わないしで、これでいいやにしたのかもしれない。

参考までに、私のスクリプトの使い方です。
1. ROX-Fierで、対象ディレクトリのアイコンが見える状態で開く
2. Shift+@(`)入力で、ROX-Fierで開いているディレクトリがカレントの端末を開く
3. ls の出力から、マウスの中ボタンで、ディレクトリ名をコピペして実行

この様な使い方を想定なので、あまり長い絶対パスでのディレクトリ指定の使用は考慮していません。
おそらく、パスの長さの数値的な制限もあるだろうけど、その制限値を私は知りません。
まあ、常識的な範囲内なら、問題無いと思いますが。
最後に編集したユーザー ルビー [ 18/04/11(水) 08:57 ], 累計 1 回
アバター
ルビー
記事: 1240
登録日時: 14/11/24(月) 12:12

Re: ディレクトリの実容量をバイト表示

投稿記事 by ルビー »

ミトじい さんが書きました:私も最近モノグサになってきてマウスだけで済ませたいので、roxファイラの右クリックメニューで起動できるようにして、ありがたく使わせてもらってます
なかなか便利そうですね。
ただし、無保証と言う事でお願いします(^^;。

ROX-Filer経由で引数が渡される際の挙動も知らないので。
echo で引数を出力させてみたら、ごく普通に処理してるみたいですが。
ds4roxmenu をスペース入りディレクトリにも対応させるのは、ちょっと考えた限りでは面倒そうですね。

find の書式で、探索開始ディレクトリの部分に引数を渡すのですけど、デフォルトではスペース区切りでディレクトリを並べる様になってます。
そこにスペース入りを渡すとなると、

1. ディレクトリを個別にダブルクォートで囲む(全部まとめてはダメ)
2. スペース入りをワイルドカードを使って指定する
3. 一時的にコマンド区切り文字を空白以外にする(できるのかな?)

現状の ds スクリプトを使って対応させるとなると、find に渡す前に sed で整形するとか考えられます。
でも正直な話、たかがスペース入りディレクトリの為に、何でそこまで面倒な事をしなくちゃならないのだろうって感じです。

ROX-Filer用の ds スクリプト書いた方が、早いかもしれません。
ミトじい さんが書きました:ところで「実容量」って表現は日本語的には「器の大きさ」をあらわすような気がして、この場合「実占有量」の方が良いような気もするんですが、イマイチ語呂が悪いような気もして…
どうなんでしょうねぇ?
クラスタギャップ入りのディスク上の容量ではなくて、ディレクトリの実質的な容量と言う意味合いで実容量としました。
書き込みディスクに左右されない、不変の容量。
他にうまい言い方が、浮かばなかったのもありますが。

ファイルもディレクトリも容器なので、そんなに外してはいないと思いますが、ディスクも容器なのがややこしいですね。

私は「実占有量」の方が、むしろディスク上の使用量(占有量)を連想してしまいます。
日本語って、あいまいな揺らぎが多くて面倒です。
表示容量と実容量とか。

単にディレクトリサイズの方が良かったのかもしれない。
こう言う時、カタカナ言葉って便利ですね。
でも、前後の脈絡も無しでディレクトリサイズと言っても、いまいちな気もします。
アバター
ミトじい
記事: 162
登録日時: 13/09/19(木) 08:43
お住まい: 埼玉県 K市 南O

Re: ディレクトリの実容量をバイト表示

投稿記事 by ミトじい »

よく考えたら、この問題の本質は「シェルの引数の区切り文字とファイル名で使用されている文字の区別がつかない」ということで
ファイル「x」「y」「x(空白)y」「x(空白)(空白)y」が存在する状態で、ファイル名「x(空白)y」と「x(空白)(空白)y」がシェル引数に渡された時などを想定すると…
もはや泥沼ですね(;^_^A
ルビー さんが書きました:たかがスペース入りディレクトリの為に、何でそこまで面倒な事をしなくちゃならないのだろうって感じです。
激しく同感です :D
私がコンピュータの仕事(PCではありませんでしたが)始めた頃は「ファイル名は英字で始まる英数字」という世代ですので、今でも数字や特殊文字で始まったり、日本語のファイル名などにはいささか違和感が拭えません
シェル等の基本プログラムも「ファイル名は英字で始まる英数字」時代に構想されて、ファイル名に空白や特殊文字を許した時点で根本的対応されなかった「負の遺産」のような気がします
本当は多バイト多国言語対応なみの改良が必要だったような…(大げさ?)
この問題はトピックからは横道になるのでここで棚上げにしますが、何とか出来ないかユルユル探って行きたいなと思います
ルビー さんが書きました:私は「実占有量」の方が、むしろディスク上の使用量(占有量)を連想してしまいます。
実は私も投稿した後で気づきました :oops:
ホント日本語にするのは難しいですね
こうゆうことがあるたび日本語化に取り組まれてる方々のご苦労に気づきますm(_ _"m)
machine: PC-VN770WG1YW(customed) [4x intel core-i5 M460 2.53GHz, ram: 8GB]
main OS: bionic64-simple-r2 <- special thanks Mr. thinkpadnerd m(_ _)m
sub OS: linux mint, win10(Pro), win7(HP+SP1), android-x86, …
アバター
タロ兵衛
記事: 875
登録日時: 08/07/08(火) 00:11
お住まい: よこはま
連絡する:

Re: ディレクトリの実容量をバイト表示

投稿記事 by タロ兵衛 »

ミトじい さんが書きました:ファイル「x」「y」「x(空白)y」「x(空白)(空白)y」が存在する状態で、ファイル名「x(空白)y」と「x(空白)(空白)y」がシェル引数に渡された時などを想定すると…
むむむ・・・もしかして、最近はじめたミラーサーバーのファイル名表示も不味いかも。調べねば・・・
でも、試してftpが対応してなかったらどうしよう・・・

名称ですけど、「真容量」はいかがかなと。これも語呂悪いし、漢字の感じもですけど
neo実験君こと次期メインマシン
Intel Core i5-8400 2.80GHz
xenialpup64 7.5+lang_pack_ja-xenial64e
アバター
ルビー
記事: 1240
登録日時: 14/11/24(月) 12:12

Re: ディレクトリの実容量をバイト表示

投稿記事 by ルビー »

ミトじい さんが書きました:もはや泥沼ですね(;^_^A
すみません。
半分、寝ながら思い付きで書いたのですけど、
まさか、本当にトライするとは思わなかった(^^;。
ルビー さんが書きました:1. ディレクトリを個別にダブルクォートで囲む(全部まとめてはダメ)
2. スペース入りをワイルドカードを使って指定する
3. 一時的にコマンド区切り文字を空白以外にする(できるのかな?)
どうやら、2, と 3. のアプローチを検討しているみたいですが、結構、面倒だと思います。
コマンド区切り文字を変えるにしても、バッティングしない文字って、いったい何の文字を使えば良いのだろう?とか。

1. が一番簡単です。
できそうと言うか、もうできました。

ただ、ワイルドカードが使えなくなったりとか、私のコマンドライン中心の用途とはちょっと離れてしまったりするので、検討中です。
まとめたら、アップしますので、ちょっと待っててください。
ミトじい さんが書きました:この問題はトピックからは横道になるのでここで棚上げにしますが、何とか出来ないかユルユル探って行きたいなと思います
私は、すぐに脱線するので、突っ込みはやめておきますが、ファイル名は昔ながらの8.3形式が、一番シンプルで使いやすく思います。
アバター
ルビー
記事: 1240
登録日時: 14/11/24(月) 12:12

Re: ディレクトリの実容量をバイト表示

投稿記事 by ルビー »

タロ兵衛 さんが書きました:名称ですけど、「真容量」はいかがかなと。これも語呂悪いし、漢字の感じもですけど
意味的には、一番合ってると思うけど、語感が重たいですね。
ディレクトリの真容量。
う~ん。
やっぱり、耳慣れない言葉なので、一瞬、頭がフリーズする感じがする(^^;。

何だか、Frugalインストールの和訳問題に似ていますね。
Zstep
記事: 207
登録日時: 16/12/06(火) 12:49

Re: ディレクトリの実容量をバイト表示

投稿記事 by Zstep »

Roxファイラの右クリックメニューからの起動でスペース入りディレクトリ対応ですが
区切り文字を一時的に改行のみに変更でもいけそうですね(環境変数IFSの一時的変更)
結果の表示にyadを使っています

参考にしたwebページ
半角スペースを含むファイルの対応
http://te2u.hatenablog.jp/entry/2013/09/16/130413

コード: 全て選択

#!/bin/sh
(  
IFS=$'\n'
    find $* -type f -printf "%s\n" | awk '
    {sum += $1}
    END {
      printf("%\047d files\n",NR) 
        printf("%\047d byte\n",sum) 
    }'| yad --text-info --fontname="Sans 12" --title "ディレクトリの実容量" --text="$@" --width=400 --button=gtk-ok:0
)

使い方
上記の内容を記載したスクリプトを適当な名前で作って適当な場所に保存
端末で下記コードを実行してシンボリックリンクを張るとRoxファイラの右クリックメニュー登録されるので
調べたいフォルダを右クリックしてdsyadを起動

コード: 全て選択

ln -s /root/my-applications/bin/dsyad /root/.config/rox.sourceforge.net/SendTo/.inode_directory/dsyad
スクリプトの名前 dsyad 保存先/root/my-applications/bin メニューに表示される名前 dsyadの場合です、
別の名前、保存場所にした場合は置き換えてください)
*ザックリとしか検証していませんなにか不具合があるかもしれません
添付ファイルを見るにはパーミッションが必要です
アバター
ルビー
記事: 1240
登録日時: 14/11/24(月) 12:12

Re: ディレクトリの実容量をバイト表示

投稿記事 by ルビー »

ROX-Filer起動用の dsrox(directory size rox)を作ってみました。

下記二つのファイルを、ROX-Filer → 新規作成 → Script で作成します。
作成ファイルの1行目 #!/bin/sh の下に、それぞれの中身をコピペします。

Directory_Size

コード: 全て選択

urxvt -geometry 35x15 -e dsrox "$@"
dsrox

コード: 全て選択

IFS=$'\n'
echo "$*"
echo
IFS=$' \t\n'

find "$@" -type f -printf "%s\n" | awk '
{sum += $1}
END {
    printf("%\047d files\n",NR)
    printf("%\047d byte\n",sum)
}'

echo
read -p Done
作成したファイルを、それぞれ次のディレクトリに配置します。

Directory_Size → /root/.config/rox.sourceforge.net/OpenWith
dsrox → /root/my-applications/bin

使い方
1. ROX-Filerで対象のディレクトリ、ファイルを選択(複数選択可能)
2. 右クリック → Open With... → Directory_Size
3. ミニ端末が開いて、ディレクトリの合計ファイル数、バイト単位の実容量を表示
4. Enterキーの入力で端末閉じる

スペース入りディレクトリも可能です。
これが、出来ないと何の為に作ったのか分からない(^^;。
右クリック → Open With... は、「アプリに送る」となっている場合があります。

コマンドラインで使う人はいないと思いますが、その際の注意書きです。
・ワイルドカードは使用不可
・スペース入りディレクトリの指定は、ダブルクォート( " )で囲む
・Enterキー入力で終了

とりあえず、他の事は別記事にします。
アバター
ルビー
記事: 1240
登録日時: 14/11/24(月) 12:12

Re: ディレクトリの実容量をバイト表示

投稿記事 by ルビー »

dsrox 起動用のスクリプト、Directory_Size の配置についてです。

通常はディレクトリ、ファイル、それぞれを選択時用の登録ディレクトリに、シンボリックリンクをコピーします。
その方法では、起動場所が複数できてややこしいのと、複数選択時に結局は 右クリック → Open With... からしかできないので、起動場所は Open With... だけにしました。

シンボリックリンクを作る手順も煩雑なので、直接スクリプトを配置する方法で書きました。
この辺は、使う人のお好みにしてください。

Open With... に登録してあるメニューは、Xenialpupではスッキリしていますが、571JP、Tahrpupでは山の様に入っています。
私はほとんど使わないので、/root/.config/rox.sourceforge.net/OpenWith のファイルを他に移動したのですが、この中から更にいろいろなファイルタイプにリンクされています。
面倒なので、個別タイプ用のメニューもバッサリ消してしまいました。

ROX-Filerの右クリックメニューを整理しないと、使い勝手が微妙な気もします。

ds → dsrox の違いのポイントです。
find $* -type f → find "$@" -type f

この変更で、スペース入りディレクトリが指定可能になります。
簡単に説明すると、引数を個別に " で囲んでくれます。
こんな感じ。
"usagi" "kame" "tanuki kuma"

スクリプト中の、IFS で区切り文字を改行にしたのは、対象ディレクトリ表示の為です。
対象が複数の場合、表示がフルパスの横並びでは見づらいので、縦並び表示にしました。

区切り文字をデフォルトに戻してあるのは、ワイルドカード使用時に、対象ディレクトリの表示との整合性が付かなくなるなどの理由です。
ROX-Filer用なので、ワイルドカード使用の引数など来ないのですが、素直な方法の "$@" で、スペース入りディレクトリに対応しました。
find で検索して来る人もいるかもだし。

実は、対象ディレクトリを縦並びに表示させるのが、一番苦労しました。
初めは、echo の出力を sed で改行入れて、整形すれば簡単だろうと思っていましたが、ダブルクォートが絡んでくると、一筋縄ではいきませんでした。
どうもクォートが絡む展開は、内部で特殊な処理がされているみたいです。

IFS で区切り文字を改行に変えたら、簡単にできました。
Zstepさん、ありがとうございます。

本当は、スクリプトも一つにまとめたかったので、yad を使おうと思ったのですが、571JP、Tahrpupでは、タスクバーに表示されませんでした。
Xenialpupでは表示されますが、571JPのyadのバージョンが古いからだろうと思います。
デスクトップがウィンドウだらけになって、dsroxが隠れてしまった時に、タスクバーにも出ないのでは困るかもしれないので、端末を使いました。

dsyad は、対象ディレクトリの表示が、複数選択時に一つしか表示されませんが、
--text="$@" → --text="$*" で、全部表示されます。
返信する