🍑

[PHP]いちばん新しい/古いファイルを取得する

2022/04/19に公開

1. 概要

PHPでいちばん新しい/古い1ファイルを取得する方法
exec関数(外部プログラムを実行する関数)でスッキリ1行に収めてます

2. コード

(1) Linuxコマンド

まずは、元となる(execで実行させる)Linuxコマンドから
ls, grepのオプションとtail, headをうまく組み合わせる

# カレントディレクトリでタイムスタンプのいちばん古いファイル or ディレクトリを取得
ls -t | tail -n 1

# カレントディレクトリでタイムスタンプの3番目に古いファイル or ディレクトリを取得
ls -t | tail -n 3 | head -n 1

# カレントディレクトリでタイムスタンプのいちばん新しいファイル or ディレクトリを取得
ls -tr | tail -n 1

# カレントディレクトリでタイムスタンプの3番目に新しいファイル or ディレクトリを取得
ls -tr | tail -n 3 | head -n 1

# カレントディレクトリでタイムスタンプのいちばん古いjsonファイルを取得
ls -t *.json | tail -n 1

# testディレクトリ下のタイムスタンプのいちばん古いファイルを取得
ls -Ft ./test/ | grep -v / | tail -n 1

# testディレクトリ下のタイムスタンプのいちばん新しいディレクトリを取得
ls -Ftr ./test/ | grep / | tail -n 1

(2) PHP

exec関数の第1引数に実行したいLinuxコマンドを記述するだけ

// カレントディレクトリでタイムスタンプのいちばん古いファイル or ディレクトリを取得
$result = exec('ls -t | tail -n 1');
echo $result."\n";

// カレントディレクトリでタイムスタンプの3番目に古いファイル or ディレクトリを取得
$result = exec('ls -t | tail -n 3 | head -n 1');
echo $result."\n";

// カレントディレクトリでタイムスタンプのいちばん新しいファイル or ディレクトリを取得
$result = exec('ls -tr | tail -n 1');
echo $result."\n";

// カレントディレクトリでタイムスタンプの3番目に新しいファイル or ディレクトリを取得
$result = exec('ls -tr | tail -n 3 | head -n 1');
echo $result."\n";

// カレントディレクトリでタイムスタンプのいちばん古いjsonファイルを取得
$result = exec('ls -t *.json | tail -n 1');
echo $result."\n";

// testディレクトリ下のタイムスタンプのいちばん古いファイルを取得
$result = exec('ls -Ft ./test/ | grep -v / | tail -n 1');
echo $result."\n";

// testディレクトリ下のタイムスタンプのいちばん新しいディレクトリを取得
$result = exec('ls -Ftr ./test/ | grep / | tail -n 1');
echo $result."\n";

3. 向いてないパターン

複数ファイル取得するパターン
例えば、カレントディレクトリで4,5番目に新しいファイルを取得する場合

コマンドと実行結果
$ ls -Ft ./test/ | grep -v / | tail -n 3 | head -n 2
waltz.txt
bar.txt

PHPの場合は以下の通り

testExec.php
<?php

$result = exec('ls -tr | tail -n 5 | head -n 2');
echo $result."\n";

実行結果は以下の通り

testExec.php野実行結果
$ php ../testExec.php
string(7) "bar.txt"

細かいところは置いておいて、bar.txtのみが出力され、waltz.txtは出力されない
→ exec関数は 「コマンド結果の最後の行を返す」 ため
こういう場合はループ文とか使ったほうがよさそう

4. 参考

Discussion