それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

ディレクトリの中のファイルを「時刻」でソートする find と lsをつかって、最新のファイルだけを取り出す。

ls コマンドの場合

ls -t | head -n1

ls コマンドで、時刻順に並べることができるので、これを head と組み合わせれば出来る。

takuya@Gitlab:~$ sudo ls -lt  /var/opt/gitlab/backups/
total 92268132
-rw------- 1 git    git    43629199360 Apr 25 02:20 1587748340_2020_04_25_12.9.2_gitlab_backup.tar
drwx------ 7 git    git           4096 Apr  4 03:40 tmp
-rw-r--r-- 1 takuya takuya 47202314240 Apr  4 02:17 1585836147_2020_04_02_12.9.2_gitlab_backup.tar
-rw------- 1 git    git     3651025200 Apr  3 22:25 registry.tar.gz

ただし、取り出せるのは「basename」のファイル名です。

サンプル

takuya@Gitlab:~$ sudo ls -t  /var/opt/gitlab/backups/  | head -n 1
1587748340_2020_04_25_12.9.2_gitlab_backup.tar

find コマンドでやる場合

find コマンドでもできます。

最新の1件だけを取り出すには、head と組み合わせれば大丈夫かな。

find  /var/opt/gitlab/backups/ -type f  -printf "%T@ %p\n" | sort -nr| head -n 1

動作の原理について

find コマンドには printf のオプションがあって、これを使ってsort してあげれば、カンタンに実現できます。

takuya@Gitlab:~$ sudo find  /var/opt/gitlab/backups/ -type f  -printf "%T@ %Tc %p\n" | sort -nr
[sudo] password for takuya:
1587748816.6963751750 Sat Apr 25 02:20:16 2020 /var/opt/gitlab/backups/1587748340_2020_04_25_12.9.2_gitlab_backup.tar
1585934261.3147121750 Sat Apr  4 02:17:41 2020 /var/opt/gitlab/backups/1585836147_2020_04_02_12.9.2_gitlab_backup.tar
1585920302.0000000000 Fri Apr  3 22:25:02 2020 /var/opt/gitlab/backups/registry.tar.gz

find の場合は、パス名で返ってくる。 パスで取れるのは、ls に比べて便利かもしれない。

最新ファイルのフルパスがほしいときは、 find の引数にフルパスを入れてあげればいいのだから。

動作サンプル

takuya@Gitlab:~$ sudo find  /var/opt/gitlab/backups/ -type f  -printf "%T@ %p\n" | sort -nr| head -n 1 | cut -d' ' -f2
/var/opt/gitlab/backups/1587748340_2020_04_25_12.9.2_gitlab_backup.tar

参考資料

https://superuser.com/questions/294161/unix-linux-find-and-sort-by-date-modified