Samba経由で開いているファイルの一覧を、開かれた順に取得する。 Sambaに含まれるsmbstatusコマンドを-Lオプション付きで使えば、ロックされている(開いた状態の)ファイルの一覧を取得することが出来る。 しかしロックされた順には表示されない上、何らかの理由によりロックされたままになっているファイルも表示されてしまう。

そこで、ロックされているファイル名と一緒に表示される日時情報を元にして開かれた順に並べ替え、ロックされたままのファイルを無視しやすいようにしてから、開いているファイルの一覧を取得する。

#!/usr/bin/perl

#
# smblastlocked.pl
# 
# Usage: smblastlocked.pl
#

# ロックされているファイルとロック開始時刻のハッシュ
my %files = ();

# 月の名前と月の値
my %months = (
  "Jan" =>  1,
  "Feb" =>  2,
  "Mar" =>  3,
  "Apr" =>  4,
  "May" =>  5,
  "Jun" =>  6,
  "Jul" =>  7,
  "Aug" =>  8,
  "Sep" =>  9,
  "Oct" => 10,
  "Nov" => 11,
  "Dec" => 12,
);

# smbstatus -Lで得られる結果を一行ずつ読み取る
foreach my $line ( `/usr/bin/smbstatus -L` ) {
  # 改行文字を削除
  chomp( $line );

  # ファイル名・ロック開始日時を取得する
  my $file, $date;

  if ( $line =~ /\s+((\/[^\/]+)+)$/ ) {
    # ファイル名 + 日時
    $file = $1;

    # ファイル名と日時を分けて取り出す
    if ( $file =~ /(.*[^\s])\s+([A-Z][a-z][a-z])\s([A-Z][a-z][a-z])\s(\d{1,2})\s(\d{1,2})\:(\d{1,2})\:(\d{1,2})\s(\d{1,4})/) {
      $file = $1;

      # 日時はyyyyMMddHHmmssの形式に変換する(日時の大小を比較しやすくする)
      # $2  $3  $4 $5 $6 $7 $8
      # Fri Jun 15 14:41:43 2007
      $date = sprintf( "%04d%02d%02d%02d%02d%02d", $8, $months{$3}, $4, $5, $6, $7 );

      # ハッシュに追加
      $files{$file} = $date;
    }
  }
}

# 日時の新しい順に並び替えて表示する
my @sorted = sort { $files{$b} cmp $files{$a} } keys %files;

foreach my $f ( @sorted ) { 
  print "$f\n";
}