
Ubuntu日本語フォーラム

ログインしていません。
Ubuntu 10.04 を使用しています。
Nautilus でフォルダのプロパティを表示すると、例えば「19個のアイテム、サイズは 84.5 MB」のように表示されますが、これを「ファイル数」「フォルダ数」「(MB や KB などのまとめた単位ではなく) byte 単位の総サイズ」で表示することはできないでしょうか?設定には見当たりませんでした…
もし、Nautilus では不可能な場合は、他のツールもしくはコマンドで表示する方法はありますか?よろしくお願いします。
オフライン
できます。
以前に自作スクリプトとして追加しました。
アップロードしてリンク貼ります。
オフライン
まず、Pythonをインストールしておいてください。
端末なら、
sudo apt-get install python
のように。
その後
http://pc944.up.seesaa.net/files/nautilus.tar.gz
こちらをダウンロードしていただいて、
中の「詳細を表示」をデスクトップなどに解凍してください。
その後、Alt+F2(Windows風カスタマイズとかしてたらWin+Rとかに変わっている可能性も)
で開く画面に、
「nautilus .gnome2/nautilus-scripts」
と入力して実行すると、
スクリプト用のフォルダが開きます。
(フォルダがないと言われた場合は、
端末で、「mkdir ~/.gnome2/nautilus-scripts」を実行してから、
もう一度してみてください。)
ここに先程解凍したファイルを置いてください。
この後デスクトップ等に置いた方のファイルは消していただいて結構です。
nautilus-scriptsフォルダにさえあればいいので。
その後、再ログオンするか、
再びAlt+F2(これも前と同じくWin+Rになっているかも)を開き、
killall nautilus
を実行してください。
nautilusがリフレッシュ(?)します。正確には終了させているのですが。
そうすれば、ファイルを右クリックして、スクリプト(S)内の詳細を表示をクリックすれば、
byte単位で表示されるはずです。
オフライン
こんな感じでいかがでしょう。
#! /bin/sh
base=`echo $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS | sed 's/\n//'`
dcount=`find "${base}" -mindepth 1 -maxdepth 1 -type d | wc -l`
fcount=`find "${base}" -mindepth 1 -maxdepth 1 -type f | wc -l`
allsize=`du -sb "${base}" | awk '{print $1}'`
zenity --info --text="$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS\n directory: $dcount \n items: $fcount \n totalling: $allsize byte."~/.gnome2/nautilus-scripts/ 以下に 00DirInfo の名前で上記内容を保存。実行属性を付けるのを忘れずに。
再帰的検索はしません。
複数選択も対応してません。
選択したディレクトリ以下にあるディレクトリ数とファイル数、サイズを表示します。
オフライン
なるほど。そちらのほうがコンパクトでいいかもしれません。
ちなみに先程貼った方は、複数ファイル、単ファイル単位で数えます。
フォルダ内を知るのなら、そちらのほうが便利ですね。
2つとも入れて、場合によって使い分けるといいかもしれません。
オフライン
pc944 さん、yama さん、早速教えていただきありがとうございます。お二方に教えていただいた方法で試してみた上でもう少し教えてください(以下、長くなってすみません)。
ふたつのスクリプト結果を確認するために以下のようなディレクトリ構成を作ってみました(pc944 さんの圧縮ファイルとその展開ファイルを使用しました)。
check_size (ディレクトリ)
├ nautilus.tar.gz 1044 byte
├ 詳細を表示 2065 byte
└ sub (ディレクトリ)
├ nautilus.tar.gz_2 1044 byte
└ 詳細を表示_2 2065 byte
単純に check_size ディレクトリの情報としては 1 ディレクトリ 4 ファイル 6,218 byte だと思いましたが、以下のような表示になりました。
Nautilus → 5個のアイテム、サイズは 10.1 KB
詳細を表示 → 2 -1個のファイル サイズ 4.0 KB(4096 バイト)
00DirInfo → directory: 1 items: 2 totalling: 14410 byte.
ls -laR(サイズと名前だけの抜粋) ↓
.:
4096 .
4096 ..
1044 nautilus.tar.gz
4096 sub
2065 詳細を表示
./sub:
4096 .
4096 ..
1044 nautilus.tar.gz_2
2065 詳細を表示_2
上記のサイズを合計すると 26,698 byte
これはどのように理解すれば良いでしょうか? 一応、表示されたサイズから逆に考えて以下のようになっているのかな?と推測してはみましたが…。
Nautilus : 以下の 1 ディレクトリ 4 ファイルの 5 個のアイテム
1044 nautilus.tar.gz
4096 sub(ディレクトリ)
2065 詳細を表示
1044 nautilus.tar.gz_2
2065 詳細を表示_2
合計サイズ 10,314 byte を 1,024 で割ると 10.072265625 なので四捨五入して 10.1 KB
詳細を表示 : 以下の 2 個のファイル(-1 は分かりませんでした…)
1044 nautilus.tar.gz
2065 詳細を表示
サイズは check_size ディレクトリそのもののサイズ
00DirInfo : 以下の 1 ディレクトリ 2 ファイル
1044 nautilus.tar.gz
4096 sub(ディレクトリ)
2065 詳細を表示
サイズは以下の 2 ディレクトリ 4 ファイルの合計 14,410 byte
4096 .(ディレクトリ)
1044 nautilus.tar.gz
2065 詳細を表示
4096 .(ディレクトリ)
1044 nautilus.tar.gz_2
2065 詳細を表示_2
ディレクトリに 4,096 byte とあるのはディレクトリ情報用のサイズ(管理用?)でしょうか?(ディレクトリの中身が増えれば 4,096 byte より大きくもなる?)ということで、"." はカレント ディレクトリの 4,096 byte で ".." は親ディレクトリの 4,096 byte なのでしょうか。ちなみに FAT32 のディレクトリのサイズを見てみると 8,192 byte でした。
(上記の推測が正しいとすれば)Nautilus のサイズ表示にディレクトリのサイズが含まれていることに気付いていなかったのですが、Linux では純粋にファイル サイズだけの合計という使い方はあまりしないのでしょうか?私は check_size ディレクトリ には 1 ディレクトリ 4 ファイルあって、サイズの合計は以下のファイルだけの合計で 6,218 byte なのかな?と思っていました。
1044 nautilus.tar.gz
2065 詳細を表示
1044 nautilus.tar.gz_2
2065 詳細を表示_2
ディレクトリの情報用(?)サイズが含まれていて、しかもファイル システムによって異なる場合もあるのであれば、ファイル管理上は不便な気がするのですが…(例えば、同じであるはずのふたつのディレクトリ サイズを比較する場合に、それぞれのファイル システムが違っていると合計サイズが異なることになると思います)。
オフライン
ocean による投稿:
ディレクトリに 4,096 byte とあるのはディレクトリ情報用のサイズ(管理用?)でしょうか?(ディレクトリの中身が増えれば 4,096 byte より大きくもなる?)ということで、"." はカレント ディレクトリの 4,096 byte で ".." は親ディレクトリの 4,096 byte なのでしょうか。ちなみに FAT32 のディレクトリのサイズを見てみると 8,192 byte でした。
ディレクトリもファイルです。ディレクトリ内のファイル数が増加するとディレクトリのサイズも増えます。
「.」も「..」もファイルです。
00DirInfo はディレクトリエントリもサイズに含めて計算しています。除外するのが面倒だったので。
ocean による投稿:
ディレクトリの情報用(?)サイズが含まれていて、しかもファイル システムによって異なる場合もあるのであれば、ファイル管理上は不便な気がするのですが…(例えば、同じであるはずのふたつのディレクトリ サイズを比較する場合に、それぞれのファイル システムが違っていると合計サイズが異なることになると思います)。
異なるファイルシステム上のディレクトリサイズを比較する意味がよくわかりません。
バックアップやミラーリングなら普通はファイル単位で比較するので……
具体的になにをしたいのか書いていただければ有効なアドバイスが返ってくるかもしれません。
オフライン
ocean による投稿:
ディレクトリに 4,096 byte とあるのはディレクトリ情報用のサイズ(管理用?)でしょうか?(ディレクトリの中身が増えれば 4,096 byte より大きくもなる?)ということで、"." はカレント ディレクトリの 4,096 byte で ".." は親ディレクトリの 4,096 byte なのでしょうか。ちなみに FAT32 のディレクトリのサイズを見てみると 8,192 byte でした。
ここのところだけ。
大抵のファイルシステムでは作成時にブロックサイズを選択することができます。
逆にいうと同じファイルシステムでもブロックサイズが違えば最小消費ディスクスペースは異なります。
一般論としては、ブロックサイズを小さくすると、ファイルの読み出しが遅くなるというデメリットがあります。
逆にブロックサイズを大きくすると、小さなファイルを大量に作成したときに、無駄になるディスクスペースが多くなるというデメリットがあります。
このトレードオフと、各パーティションの用途を考慮してブロックサイズを選択するのもよいでしょう。
# 昔は/var以下のファイルは割と小さいファイルが多く存在したのでブロックサイズを小さめにしていたとか。
今はHDD自体が巨大になったため、あまり、気にするほどのことも無いかもしれません。
オフライン
ディレクトリエントリを除外して厳密にファイルだけの合計を求めるパターン。
#! /bin/sh
# -*- mode: shell-script -*-
# last updated : 2010/07/31 21:53:53 JST
# nautilus-script.
# 選択したdirectory以下にあるファイル数、ディレクトリ数、合計サイズを表示する。
# 複数選択不可。再帰検索はしない。
base=`echo $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS | sed 's/\n//'`
dcount=$(find "${base}" -mindepth 1 -maxdepth 1 -type d | wc -l)
fcount=$(find "${base}" -mindepth 1 -maxdepth 1 -type f | wc -l)
allsize=`find "${base}" -mindepth 1 -maxdepth 1 -type f -printf "%s\n" | awk '{ sum += $1; }; END { print sum }'`
zenity --info --text="$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS\n directory: $dcount \n items: $fcount \n totalling: $allsize byte."オフライン
yama さん、hmatsue さん、アドバイスありがとうございます。
yama による投稿:
ディレクトリもファイルです。ディレクトリ内のファイル数が増加するとディレクトリのサイズも増えます。
「.」も「..」もファイルです。
hmatsue による投稿:
大抵のファイルシステムでは作成時にブロックサイズを選択することができます。
逆にいうと同じファイルシステムでもブロックサイズが違えば最小消費ディスクスペースは異なります。
ディレクトリもファイルなんですね。ディレクトリに含まれているファイルの一覧やそのファイルの場所などが入っている感じなんですかね。"." は親ディレクトリを指し示す情報で、".." は自ディレクトリの情報でしょうか。ディレクトリに表示されているサイズは、私の ext4 環境ではブロック サイズが 4,096 byte で、このディレクトリ ファイルの最小単位が 4,096 byte に収まっているということなのですね。
hmatsue による投稿:
このトレードオフと、各パーティションの用途を考慮してブロックサイズを選択するのもよいでしょう。
# 昔は/var以下のファイルは割と小さいファイルが多く存在したのでブロックサイズを小さめにしていたとか。
ディレクトリの用途別にブロック サイズを変更するということもあるのですね。これはディレクトリ毎にマウントができて、複数のファイル システムから選択できる Linux/Unix ならではといった感じでしょうか。
yama による投稿:
異なるファイルシステム上のディレクトリサイズを比較する意味がよくわかりません。
バックアップやミラーリングなら普通はファイル単位で比較するので……
具体的になにをしたいのか書いていただければ有効なアドバイスが返ってくるかもしれません。
事の発端は、Ubuntu 上のファイルをバックアップしようと思ったことでした。バックアップ媒体として FAT32 フォーマットの USB HDD を用意しました。バックアップしたファイルは Windows からもアクセスできるようにしたかったので FAT32 のままです(NTFS でもいいのですが、USB HDD が購入時点で FAT32 フォーマットだったのでそのままで)。ちなみに、バックアップ対象ファイルの所有者やアクセス権の保持は不要ということで。
Ubuntu から USB HDD へコピーするためのツールや方法も調べてみようと思っていますが、とりあえずディレクトリを Nautiuls でコピーしてみました。で、コピー後のディレクトリ サイズを比較してみるとサイズが異なりますし(ディレクトリのサイズの分、違っていたのでしょうね)、表示単位も異なります。バイト単位で比較したいな…ということから冒頭の質問になりました。
Windows では Disk Mirroring Tool というツールを使っています。ツールでバックアップ/ミラーリングした後で、ディレクトリ サイズ同士を比較することもあるので(単に簡易なダブル チェックという意味で)、Ubuntu でも同様の操作ができないかな?と思っています。
yama による投稿:
ディレクトリエントリを除外して厳密にファイルだけの合計を求めるパターン。
変更していただいてありがとうございました。動作確認できました。ちなみに、スクリプト中の find コマンドのパラメーターの -maxdepth 1 を外すとサブ ディレクトリ以下もチェック対象になったように見えるのですが、あえてこのパラメーターを入れて「再帰検索はしない。」としているのには何故ですか?単に yama さんの用途ではサブ ディレクトリを除外したかった、ということですか?それとも、-maxdepth 1 を外すと何らかの弊害があるのでしょうか?簡単に確認してみた程度ではサブ ディレクトリを含めたファイルの合計サイズが表示されているように見えているのですが。
オフライン
ocean による投稿:
Windows では Disk Mirroring Tool というツールを使っています。ツールでバックアップ/ミラーリングした後で、ディレクトリ サイズ同士を比較することもあるので(単に簡易なダブル チェックという意味で)、Ubuntu でも同様の操作ができないかな?と思っています。
それでしたら rsync がお勧めです。定番ツールです。GUIなgrsyncもあるようです。これをcrontabに登録して定期的に実行すれば、定期バックアップが実現できるでしょう。rsyncはchecksumによってコピー検証もしますので、別途チェックの必要性もありません。
ただFAT32はタイムスタンプが2秒単位なので、別途rsyncのオプションでごにょごにょしないといけません。
ocean による投稿:
変更していただいてありがとうございました。動作確認できました。ちなみに、スクリプト中の find コマンドのパラメーターの -maxdepth 1 を外すとサブ ディレクトリ以下もチェック対象になったように見えるのですが、あえてこのパラメーターを入れて「再帰検索はしない。」としているのには何故ですか?単に yama さんの用途ではサブ ディレクトリを除外したかった、ということですか?それとも、-maxdepth 1 を外すと何らかの弊害があるのでしょうか?簡単に確認してみた程度ではサブ ディレクトリを含めたファイルの合計サイズが表示されているように見えているのですが。
いえディレクトリ数というオーダがありましたので、じゃあそのまた中はいいかと思っただけです。
自由に改造しちゃってください。
オフライン
yama さん、ありがとうございます。
yama による投稿:
それでしたら rsync がお勧めです。定番ツールです。GUIなgrsyncもあるようです。これをcrontabに登録して定期的に実行すれば、定期バックアップが実現できるでしょう。rsyncはchecksumによってコピー検証もしますので、別途チェックの必要性もありません。
rsync と grsync を試してみたいと思います。どちらもパッケージ マネージャーからインストールできました。
yama による投稿:
いえディレクトリ数というオーダがありましたので、じゃあそのまた中はいいかと思っただけです。
自由に改造しちゃってください。
ありがとうございます。早速、サイズの表記を3桁ごとのカンマ区切りに改造してみようと思ったのですが難しいんですね。そもそも、シェル スクリプトもひとつひとつ調べながらで時間がかかるレベルなので無謀だったのかもしれませんが。
教えていただいたスクリプトの allsize をカンマ編集すれば…と思って、「sed でできるかも?」と調べ始めてみましたが sed では難しいようです(自分で判断できたわけではなくて、そう書いている方がいらっしゃったのですが (^^;)。いろいろ探してみたところ perl で実現されている方のページを見つけましたので、その部分だけ利用させてもらって↓こんな風にしてみました(yama さんのスクリプトの最後の行(zenity の行)の上に1行追加)。
allsize=`echo $allsize | perl -e '$str = <STDIN>; $str =~ s/(\d{1,3})(?=(?:\d\d\d)+(?!\d))/$1,/g; print $str'`allsize をそのまま perl スクリプトに渡せれば良いのですがその方法が分からず、わざわざ echo で出力して perl に標準入力経由で渡しています。さらに、perl スクリプトの中で処理結果を allsize に代入できれば良いのでしょうが、それも分からずに print してから allsize に渡しています。もちろん(?)置換部分は理解できていません (^^;。そのまま張り付けてあります。
流用させてもらった部分はともかく、変数の受け渡しはもっとスマートな方法があるでしょうが、とりあえずはカンマ区切り表示になりました。
いろいろ教えていただき、ありがとうございました!
オフライン