【Linux】複数ディレクトリにまたがって特定の正規表現に当てはまるの最新のファイル一つのパスを得るコマンド

著者:杉浦

【Linux】複数ディレクトリにまたがって特定の正規表現に当てはまるの最新のファイル一つのパスを得るコマンド

 Linuxのコマンドはかなり機械語に近いところで最適化されており高速です。PHPのファイルシステムを介していては遅いと言わざるを得ないような場面でもコマンドをexecすれば高速です(プログラム実行関数を扱う際は文字列のエスケープなど対策を忘れないようにする必要があります。任意コード実行のセキュリティホールに繋がるので細心の注意が必要です)。
 とある単一のディレクトリの中で最新をとってくるのは簡単です。

ls -lt ./* | grep -e \.ほしいファイルの拡張子$ | head -n 1| awk '{print $NF}'

lsコマンドのtオプションはファイルを最終更新日時順に表示します. grepでほしいファイル種別に表示を絞り込みます。headコマンドの-n 1で最初の一行のみの表示を取得します。awkの$NFには区切られた文字の内の最後が入ります。結果次の様にファイルのパスが出力されます。

複数ディレクトリはちょっと手間です。ls dirA/* dirB/*とするとディレクトリごとの結果が出てくるのでまとめてソートする必要があります。

ls -l --full-time dirA/* dirB/* dirC/* | grep -e \.ほしいファイルの拡張子$ | sort -k 6,7 -r | head -n 1| awk '{print $NF}'

lsの–full-timeオプションで日時表示をソートしやすい形(なしだと月日で手間)にして出力。sortで6,7列目(-k 6,7)の日時を降順(-r)でソートします。最後はディレクトリ一つの時同様にhead -n 1| awk ‘{print $NF}で完成です。

  • この記事いいね! (1)

著者について

杉浦 administrator