MacOSのターミナル(Terminal)でフォルダ検索と容量の計測を行う際にプログレスバーを追加するためには、find
コマンドと併用して pv
コマンドを使用する方法があります。ただし、pv
はデフォルトではインストールされていないため、Homebrewなどを使ってインストールする必要があります。
以下の例では、Python の仮想環境のディレクトリ名としてよく使われるvenv
と venv2
フォルダを検索する例です。該当フォルダの容量と、ディレクトリ名を表示します。また、プログレスバーを表示して、進捗度合いを可視化します。
必要なツールをインストール
Homebrewがインストールされていない場合、インストール
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
pv
をインストール
brew install pv
コマンド – ディレクトリ検索
venv
または venv2
ディレクトリを検索し、それらの容量とパスをタブ区切り形式で出力する。
sudo find / \( -name "venv" -o -name "venv2" \) -type d 2>/dev/null | while read dir; do du -sh "$dir"; done | awk '{print $1 "\t" $2}'
sudo find / \( -name "venv" -o -name "venv2" \) -type d 2>/dev/null
sudo find /
: ルートディレクトリから検索を開始します(管理者権限が必要なためsudo
を使用)。\(-name "venv" -o -name "venv2"\)
: 名前がvenv
またはvenv2
のディレクトリを対象にします。-type d
: ディレクトリのみを検索対象にします。2>/dev/null
: 権限不足などによるエラーメッセージを非表示にします。
2. while read dir; do du -sh "$dir"; done
while read dir; do
:find
コマンドで見つかった各ディレクトリを1つずつ処理します。du -sh "$dir"
: 各ディレクトリの容量を取得します。
3. awk '{print $1 "\t" $2}'
awk
:du
の出力を処理します。$1
: 最初の列(容量)を取得。$2
: 2列目(ディレクトリのパス)を取得。"\t"
: 2列目との間にタブを挿入。
コマンド – プログレスバーを表示し結果をファイル出力する
timestamp=$(date +%Y%m%d_%H%M%S) && total=$(sudo find / \( -name "venv" -o -name "venv2" \) -type d 2>/dev/null | wc -l) && sudo find / \( -name "venv" -o -name "venv2" \) -type d 2>/dev/null | pv -l -s $total | while read dir; do du -sh "$dir" | awk -v OFS="\t" '{print $1, $2}'; done > output_${timestamp}.tsv
timestamp=$(date +%Y%m%d_%H%M%S)
date
コマンドで現在の日付と時刻を取得します。- フォーマット例:
20241224_153045
(2024年12月24日 15時30分45秒)。
total=$(...) &&
- 事前にディレクトリ数をカウントし、
total
変数に保存します。 &&
で次のコマンドを連結し、カウントが成功した場合にのみ処理を進めます。
sudo find / \( -name "venv" -o -name "venv2" \) -type d 2>/dev/null
- ルートディレクトリから、名前が
venv
またはvenv2
のディレクトリを検索します。 - 権限不足によるエラーメッセージを
2>/dev/null
で非表示にします。
| pv -l -s $total
- プログレスバーを表示します。
-l
オプションにより、行数ベースでプログレスバーが更新されます。pv
に事前カウントしたディレクトリ数(total
)を渡し、プログレスバーを正確に表示します。
while read dir; do … done
- 各検索結果(ディレクトリ名)を1行ずつ処理します。
du -sh "$dir"
- 現在のディレクトリの容量を人間が読みやすい形式(例:
12M
,3.2G
)で取得します。
awk -v OFS="\t" '{print $1, $2}'
- 容量とパスをタブ区切り形式で整形します。
output_${timestamp}.tsv
timestamp
変数をファイル名に動的に組み込みます。
実行結果例
実行中にプログレスバーが表示され、処理が終わるとタブ区切りの結果が出力されます。
プログレスバー例:
0:00:05 [ 10/100 ] ██████▍ ETA 0:00:45
出力例:(output_${timestamp}.tsv
):
12M /Users/username/projects/venv
50M /var/www/app/venv2
1.2G /opt/old_project/venv
補足
pv
の出力形式のカスタマイズ
必要に応じて、pv
の設定(表示形式や更新頻度)を調整できます。
コメント