Solaris ファイル調査コマンド

Intel Solaris11で動作確認しています。
SPARC Solaris11でも動作するはずです。
UTF-8とEUC-jpの両方環境でSolarsi11をインストールして検証していますが、文字化けする場合にはコマンド中の日本語を英語にしてみてください。

・カレントディレクトリのファイル数を調べる
find . -type f | wc -l

・カレントディレクト以下のフォルダとファイル数を調べる
※一括のコマンドです。2行まとめてコピペして下さい
find . -type d | wc -l | awk '{d=$1} END {print "ディレクトリ数: " d}' && \
find . -type f | wc -l | awk '{f=$1} END {print "ファイル数    : " f}'

・ディレクト構造の表示
find . -print

・疑似的にtree形式で表示
find . | awk -F/ '{for(i=1;i<NF;i++) printf "  "; print $NF}'

・疑似的なtree形式でファイルに出力
find . | awk -F/ '{for(i=1;i<NF;i++) printf "  "; print $NF}' > tree.txt

・UTF8でファイルに出力したい場合(Windowsで使うなど)
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
※一時的にロケールをUTF-8に切り替える(ログオフすると元の値に戻る)

・ディレクトリの配下のファイルの数と容量
ファイル数と容量を一括で確認するスクリプトのサンプル
#調査対象ディレクトリ<DIR>
DIR="/dir" 

echo "ディレクトリ: $DIR"
echo "ファイル数: $(find "$DIR" -type f | wc -l)"
echo "合計容量: $(du -sh "$DIR" | awk '{print $1}')"

-ディレクトリ配下のファイルサイズの調査(シンボリックリンクは無視)
find . -type f -exec ls -l {} \; | awk '{print $5}' | sort -n

-ファイルサイズの一覧がdumpsizes.txtに出力(単はバイト)
find . -type f -exec ls -l {} \; | awk '{print $5}' | sort -n > dumpsizes.txt

-ディレクトリ配下のファイルサイズの中央値を表示(MB単位)
find . -type f -exec ls -l {} \; | awk '{print $5}' | sort -n | \
awk '{
  a[NR] = $1
}
END {
  if (NR % 2) {
    size = a[(NR + 1) / 2]
  } else {
    size = (a[NR / 2] + a[NR / 2 + 1]) / 2
  }
  printf "%.2f MB\n", size / (1024 * 1024)
}'

-ディレクトリ配下のファイルサイズの中央値を表示(KB単位)
※上のMB表示で0.00MBになる場合に、バイト単位などもコードを少し修正したもらえれば可能です。
find . -type f -exec ls -l {} \; | awk '{print $5}' | sort -n | \
awk '{
  a[NR] = $1
}
END {
  if (NR % 2) {
    size = a[(NR + 1) / 2]
  } else {
    size = (a[NR / 2] + a[NR / 2 + 1]) / 2
  }
  printf "%.2f KB\n", size / 1024
}'

-ディレクトリ配下のファイルを「ファイルタイプ別」に分類し、それぞれの容量の中央値をKBで表示(拡張子ではないので注意)
find . -type f | while read -r file; do
  type=$(file "$file" | sed 's|^[^:]*:[ \t]*||' | cut -d, -f1)
  size=$(ls -l "$file" | awk '{print $5}')
  echo "$type|$size"
done | sort -t'|' -k1,1 -k2,2n | nawk -F'|' '
{
  if ($1 != current_type && count > 0) {
    mid = int(count / 2)
    if (count % 2 == 1) {
      median = sizes[mid + 1]
    } else {
      median = (sizes[mid] + sizes[mid + 1]) / 2
    }
    printf "%s: %.2f KB\n", current_type, median / 1024
    i = 1
    while (i <= count) {
      delete sizes[i]
      i++
    }
    count = 0
  }
  current_type = $1
  count++
  sizes[count] = $2
}
END {
  if (count > 0) {
    mid = int(count / 2)
    if (count % 2 == 1) {
      median = sizes[mid + 1]
    } else {
      median = (sizes[mid] + sizes[mid + 1]) / 2
    }
    printf "%s: %.2f KB\n", current_type, median / 1024
  }
}'

-ダミーファイルを1KBの容量で1万ファイル作成する
ディレクトを作成(dummy_files)し、カレントに移動する。
mkdir dummy_files
cd dummy_files
上のカレント(dummy_files)以下に10000個のファイルを作成する。
i=1
while [ $i -le 10000 ]; do
  dd if=/dev/zero of="file_$i.txt" bs=1024 count=1 >/dev/null 2>&1
  i=`expr $i + 1`
done

-10KBから1MBの横領のファイルをランダムに1000ファイル作成する
以下のコードでbashファイルを適当な名前で作成して実行してください。
#!/bin/bash

# 作成先ディレクトリ
OUTPUT_DIR="./random_files"
mkdir -p "$OUTPUT_DIR"

# 10KB〜1MBの範囲(バイト単位)
MIN_SIZE=10240        # 10KB
MAX_SIZE=1048576      # 1MB

# 1000ファイル作成
for i in $(seq -w 1 1000); do
  # ランダムサイズを決定($RANDOM は 0〜32767なので2回使う)
  SIZE=$(( ( (RANDOM << 15 | RANDOM) % (MAX_SIZE - MIN_SIZE + 1) ) + MIN_SIZE ))

  # ファイル名と生成
  FILENAME="$OUTPUT_DIR/file_${i}.bin"

  # ランダム内容のファイルを生成
  dd if=/dev/urandom of="$FILENAME" bs=1 count="$SIZE" status=none

  echo "Created $FILENAME ($SIZE bytes)"
done

ご参考まで

関連記事

TOP