1. 概要

ディレクトリ内のファイルやフォルダに関するさまざまな種類の情報を取得するために使用できるコマンドがいくつかあります。 このチュートリアルでは、ディレクトリ内の最近更新または変更されたファイルに関する情報を取得するためのコマンドに焦点を当てます。

2. 設定

サンプルディレクトリを作成しましょう。

$ mkdir sample_directory

次に、そこに移動してランダムファイルを追加します。 ファイルを時系列で作成して名前を付け、追跡します。

$ cd sample_directory
$ touch file_1.txt
$ touch file_2.txt
$ touch file_3.txt

全体として、次のディレクトリ構造が必要です。

$ ls
file_1.txt  file_2.txt  file_3.txt

3. findを使用する

findは、ファイルとディレクトリを検索して操作を実行するLinuxコマンドです。ファイルの種類、フォルダ、名前、作成日、変更日、所有者、およびアクセス許可による検索をサポートします。

このコマンドを使用して、サンプルディレクトリ内の最新のファイルを表示してみましょう。

$ find /sample_directory -type f -printf "%t - %p\n" | sort -n | tail -1

Fri Feb 11 05:11:07.8808152360 2022 - sample_directory/file_3.txt

このコマンドの内訳は次のとおりです。

  • -タイプf:ディレクトリ内のすべてのファイルを検索します
  • “%t%p \ n” :ファイルごとに新しい行を出力します。ここで、%t はファイルの最終変更時刻であり、%pはファイル名パスです。 。 \nは新しい行を作成します。
  • sort -n :数値に従ってソートします
  • tail -1 :最後の行を出力します

file_3.txt は、セットアップ中に作成した最後のファイルであり、findコマンドが機能することを証明しています。

さらに、 find を使用して、最近のいくつかのファイルを降順で表示できます。

$ find sample_directory/ -type f -exec stat -c '%X %n' {} \; | sort -nr | awk 'NR==1,NR==3 {print $2}'
./file_3.txt
./file_2.txt
./file_1.txt

コマンドの内訳は次のとおりです。

  • -exec stat -c ‘%X %n’ :最終アクセス時刻とそれに続く作業ディレクトリ内の各ファイルのファイルパスを出力します
  • sort -nr :番号の逆順でソートします
  • awk’NR == 1、NR == 3 {print $ 2)’ :1行目、2行目、3行目の2番目のフィールドを出力します。これは、この場合はファイル名を表します。 ‘NR’ は、指定したファイルに存在するレコードの数を処理するために使用されるawkの特別な組み込み変数です。

awkコマンドで3の値を増減することにより、表示される最近のファイルの数を変更できます。

4. lsを使用する

lsコマンドは、Linuxおよびその他のUnixベースのオペレーティングシステムのファイルまたはディレクトリを一覧表示します。ターミナルでのファイルおよびフォルダの一覧表示方法を変更できるいくつかのフラグを受け入れます。

ls を使用して、次のコマンドで最新のファイルを表示できます。

$ ls sample_directory/ -Artls | tail -1

0 -rw-rw-r-- 1 <user> 0 Thur 11 05:11 file_3.txt

コマンドの内訳は次のとおりです。

  • -A :で始まるファイルを除くすべてのファイルを一覧表示します。 と ..
  • -r :並べ替え中に順序を逆にします
  • -t :時間で並べ替え、最新のものから
  • -l :長いリスト形式を使用する
  • -s:各ファイルの割り当てられたサイズを出力します
  • tail -1 :最後の行を出力します

ls コマンドはデフォルトでファイル名を改行で区切るため、ファイル名にスペースや改行などの特殊文字が含まれている場合、lsを使用したデータの解析はエラーが発生しやすくなります。

上記の出力では、 file_3.txt は空のテキストファイルであるため、サイズは0バイトです。

または、この ls コマンドを使用して、最新のファイルを取得することもできます。

$ ls -tp | grep -v /$ | head -1
file_3.txt

このコマンドの内訳は次のとおりです。

  • -t :時間で並べ替え
  • -p :ディレクトリに末尾のスラッシュを追加します
  • grep -v / $:スラッシュで終わるすべての行を削除します
  • head -1 :出力を単一のファイルに制限します。 -1 サフィックスを除くと、すべてのファイルが降順で表示されます。

さらに、最近作成または変更されたファイルを降順で表示することもできます。

$ ls -tl

total 0
-rw-rw-r-- 1 <user> 0 Thur 11 05:11 file_3.txt
-rw-rw-r-- 1 <user> 0 Thur 11 05:11 file_2.txt
-rw-rw-r-- 1 <user> 0 Thur 11 05:11 file_1.txt

5. Bashスクリプトの使用

Bashスクリプトは、通常は端末で手動で入力する必要がある一連のコマンドを含むプレーンテキストファイルです。 これは、定期的に使用されるコマンドを保存する場合や、一連のコマンドを実行する場合に役立ちます。

この方法は、大きなディレクトリツリーで検索を実行する場合の検索よりも比較的高速です

最新のファイルを取得する再帰的なBashスクリプトファイルを作成しましょう。

まず、作業ディレクトリに実行可能テキストファイルを作成しましょう。

$ touch bash_script.sh

次に、シバンヘッダーを追加しましょう。 これにより、Bashを使用してスクリプトを解釈できるようになります。

$ echo "#!/bin/bash" >> bash_script.sh

次に、 nano エディターでファイルを開き、このコードをshebangヘッダーの下に貼り付けます。

CURRENT_DIR='.'

get_recent_file () {
    FILE=$(ls -Art1 ${CURRENT_DIR} | tail -n 1)
    if [ ! -f ${FILE} ]; then
        CURRENT_DIR="${CURRENT_DIR}/${FILE}"
        get_recent_file
    fi
    echo $FILE
    exit
}
get_recent_file

この関数は、ディレクトリ内の最新のアイテムを取得します。 アイテムがディレクトリの場合、そのディレクトリに移動して、最新のアイテムを再帰的に検索します。

最後に、bash_script.shファイルを実行可能ファイルとして設定する必要があります。

$ chmod +x bash_script.sh

これで、次のコマンドを使用して、ターミナルからスクリプトファイルを実行できます。

$ ./bash_script.sh
bash_script.sh

bash_script.sh は、作業ディレクトリで更新した最後のファイルであるため、最新のファイルとして出力に表示されます。

6. perlを使用する

perlは、汎用、高レベル、インタプリタ、および動的プログラミング言語です。 もともとは、テキスト処理とテキストファイルのさまざまな形式への変換のために開発されました。

ディレクトリ内の最新のファイルを取得するには、パイプを介してperlfindコマンドを組み合わせます。

$ find sample_directory/ -type f -printf '%T@\t%p\n' | perl -ane '@m=@F if ($F[0]>$m[0]); END{print $m[1];}' 

./file_3.txt

このコマンドの内訳は次のとおりです。

  • -タイプf:ディレクトリ内のすべてのファイルを検索します
  • ‘%T @ \ t%p \ n’:ファイルごとに新しい行を出力します。%T はファイルの最終変更時刻であり、%pです。 はファイルパスです
  • -ane’@ m = @ F if($ F [0]> $ m [0]); 終わり :各入力レコードは分割され、と呼ばれる配列に格納されます @F。 次に、の最初の要素の値が @F 配列が @m 配列。
  • {print $ m [1];} :ファイル名を表す@ m配列の2番目の値を出力します

7. 結論

この記事では、最近作成または更新されたファイルに関する情報を取得するために使用できるほとんどのLinuxツールについて説明しました。 また、時系列に並べられた複数の最近のファイルを出力する方法についても検討しました。