【C++】Linuxでファイルを更新日時順(新しい順・古い順)に一覧表示する方法
この記事では、C++プログラムからLinuxのシェルコマンドを呼び出すことで、カレントディレクトリ内のファイルを「最終更新時刻」を基準に一覧表示する方法を解説します。最近更新されたファイルや、逆に最も古いファイルを簡単に確認できるようになります。
基本となる仕組み
実装の考え方は非常にシンプルです。Linuxには標準でlsコマンドが用意されており、オプションを組み合わせることで希望の順序でファイル情報を取得できます。
- ls -l:ファイルを詳細形式(パーミッション、所有者、サイズ、タイムスタンプなど)で一覧表示します。
- -t:更新時刻の新しい順(降順)にソートします。
- -r:ソート結果を反転させます。-tと組み合わせると、古い順(昇順)の表示になります。
したがって、実際に使うコマンドは次の2つです。
ls -lt # 新しい順に表示 ls -ltr # 古い順に表示
C++からの実行方法
C++の標準ライブラリにあるsystem()関数を使うと、プログラム内からシェルコマンドを実行できます。この関数は<cstdlib>ヘッダーで定義されており、引数として渡した文字列をそのままシェルに渡して実行します。
サンプルコード
#include<iostream>
#include<cstdlib>
using namespace std;
int main(){
// カレントディレクトリのファイルを更新時刻の降順(新しい順)で表示
cout << "ファイル一覧(先頭が最新)" << endl;
system("ls -lt"); // 時刻順にソートされたファイル一覧を表示
cout << "\n\nファイル一覧(先頭が最古)" << endl;
system("ls -ltr"); // -r オプションで逆順(古い順)に表示
return 0;
}
実行結果
ファイル一覧(先頭が最新) total 32 -rwxr-xr-x 1 soumyadeep soumyadeep 8984 May 11 15:19 a.out -rw-r--r-- 1 soumyadeep soumyadeep 424 May 11 15:19 linux_mod_list.cpp -rw-r--r-- 1 soumyadeep soumyadeep 1481 May 4 17:03 test.cpp -rw-r--r-- 1 soumyadeep soumyadeep 710 May 4 16:51 caught_interrupt.cpp -rw-r--r-- 1 soumyadeep soumyadeep 557 May 4 16:34 trim.cpp -rw-r--r-- 1 soumyadeep soumyadeep 1204 May 4 16:24 1325.test.cpp ファイル一覧(先頭が最古) total 32 -rw-r--r-- 1 soumyadeep soumyadeep 1204 May 4 16:24 1325.test.cpp -rw-r--r-- 1 soumyadeep soumyadeep 557 May 4 16:34 trim.cpp -rw-r--r-- 1 soumyadeep soumyadeep 710 May 4 16:51 caught_interrupt.cpp -rw-r--r-- 1 soumyadeep soumyadeep 1481 May 4 17:03 test.cpp -rw-r--r-- 1 soumyadeep soumyadeep 424 May 11 15:19 linux_mod_list.cpp -rwxr-xr-x 1 soumyadeep soumyadeep 8984 May 11 15:19 a.out
このように、ls -ltでは最も新しく更新されたファイルが先頭に、ls -ltrでは最も古いファイルが先頭に表示されます。
補足:system()関数を使う際の注意点
system()関数は手軽な一方で、本番環境での利用には注意が必要です。ユーザー入力などを含む文字列をそのまま渡すと、コマンドインジェクションなどのセキュリティリスクにつながる可能性があります。より安全かつ柔軟な制御が必要な場合は、POSIX APIのopendir()やstat()を使ってディレクトリを読み込み、自分でソート処理を実装する方法も検討するとよいでしょう。
-
C++とオイラー特性でサッカーボールの五角形・六角形の数を求める方法
サッカーボールをよく見ると、黒い五角形と白い六角形がパズルのように組み合わさり、完璧な球体を形作っていることがわかります。本記事では、オイラー特性(Euler characteristic)という数学的手法を用いて、サッカーボール上に存在する五角形と六角形の数を求める方法を解説し、最後にC++での実装例も紹介します。 オイラー特性とは オイラー特性とは、位相空間における図形や構造の特徴を表す数値です。球面の場合、オイラー特性は常に2になることが知られており、この性質を利用することで、サッカーボール上の五角形と六角形の数を計算できます。 オイラー特性では、以下の要素を使用します。 χ(S) —
-
C++とOpenCVで画像を読み込んで表示する方法を徹底解説
この記事では、C++でOpenCVを使用して画像を読み込み、表示する方法について詳しく解説します。OpenCVで画像の読み込みや表示を行うには、以下のような関数やデータ構造が必要になります。 画像処理に必要な基本要素 Mat(マトリクス) Matは関数ではなく、データ構造の一種である変数型です。C++におけるint型やchar型、string型のように、MatはOpenCV独自の変数型であり、画像を格納するための行列(マトリクス)データ構造を作成します。プログラム内で「Mat myImage;」と記述した場合、「myImage」という名前の行列変数を宣言していることになります。 name