1. 概要

Linuxでは、通常、ファイルの親ディレクトリを一覧表示することで、ファイルの変更日またはタイムスタンプを表示できます。 この情報を取得する他の一般的な方法は、 統計 指図。 ファイルの検索中にこの情報を表示すると便利または効率的な場合があります。

このチュートリアルでは、findコマンドの出力にファイルの変更日を表示する方法を見ていきます。

2. findコマンドのprintfオプションを使用する

まず、 find コマンドのデフォルト出力を見てみましょう。このコマンドには、見つかったファイルの名前のみが表示されます。

$ find . -name '*json*'
./json-folder
./.eslintrc.json
./file with-space.json
./package.json
./tsconfig.json

printfオプションを使用すると、出力をより便利にすることができます。 find コマンドのGNUバージョンには、printfという名前のオプションまたはフラグが含まれています。 1つの引数を受け入れます。これは、解釈されてstdoutに出力される形式です。 解釈された出力はコマンドのデフォルト出力を置き換え、解釈は見つかったファイルごとに行われます。

この形式は、円記号(\)で始まるエスケープと、パーセント(%)で始まるディレクティブで構成されます。 %t および%Tk ディレクティブを使用して、ファイルの最終変更時刻を表示します。 printf オプションの使用例を見てみましょう。ここでは、見つかったファイルの名前とそれらの最終変更時刻を出力します。

$ find . -name '*json*' -printf "%-25p %t\n"
./json-folder             Mon Aug 23 03:37:42.1869447530 2021
./.eslintrc.json          Mon Aug  9 00:09:14.6669121720 2021
./file with-space.json    Mon Aug 23 02:39:25.1991621890 2021
./package.json            Mon Aug  9 00:08:08.5493444190 2021
./tsconfig.json           Mon Aug  9 00:08:58.9590148590 2021

上記の例では、filename printfディレクティブ内にフィールド幅と呼ばれるものを指定しています。 ディレクティブの幅の単位は文字数です。 そのディレクティブの解釈された値の幅が指定された幅よりも小さい場合は、空白が埋め込まれます。 ディレクティブのフィールド幅は、ディレクティブの% signの後に指定されます。 % s ignとwidthの間のハイフン(-)は、解釈される値を左に埋める必要があることを示します。

エスケープとディレクティブの完全なリストはmanページにありますが、それらのいくつかを見てみましょう。

  • \ n –改行
  • \ t –水平タブ
  • %p –ファイルの名前
  • %M –ファイルの権限
  • %Tk kで指定された形式のファイルの最終変更時刻。 find コマンドのマニュアルページには、kの可能な値の完全なリストが含まれています。

2.1. カスタムヘルパー関数

ヘルパーbash関数を〜/ .bashrcファイルに追加して、printfオプションの使用をより効率的にすることができます。この関数は、名前に特定の単語を含むファイルを検索し、ファイルの変更時刻を表示します他の情報と一緒に。 関数を見てみましょう:

function findnamed {
    find ${2:-.} -name "*$1*" -printf "%M %-6u %-6g  %-${3:-40}p %TY-%Tm-%Td %TH:%TM\n"
}

上記の関数は3つの引数を想定しています。 最初の引数は、ファイルを名前で検索するときに使用するキーワードです。 2つ目は検索するディレクトリで、デフォルト値は現在のディレクトリです。 3つ目は、 printf オプション内のfilenameディレクティブのフィールド幅であり、デフォルト値は40です。

次に、検索キーワードのみを指定して関数を使用する方法を見てみましょう。

$ findnamed '*json'
drwxrwxr-x haben  haben   ./json-folder                            2021-08-23 03:37
-rw-rw-r-- haben  haben   ./.eslintrc.json                         2021-08-09 00:09
-rw-rw-r-- haben  haben   ./file with-space.json                   2021-08-23 02:39
-rw-rw-r-- haben  haben   ./package.json                           2021-08-09 00:08
-rw-rw-r-- haben  haben   ./tsconfig.json                          2021-08-09 00:08

検索するディレクトリとファイル名ディレクティブのフィールド幅を指定して、関数を呼び出すこともできます。

$ findnamed '*json' project-root/ 35
drwxrwxr-x haben  haben   project-root/json-folder            2021-08-23 03:37
-rw-rw-r-- haben  haben   project-root/.eslintrc.json         2021-08-09 00:09
-rw-rw-r-- haben  haben   project-root/file with-space.json   2021-08-23 02:39
-rw-rw-r-- haben  haben   project-root/package.json           2021-08-09 00:08
-rw-rw-r-- haben  haben   project-root/tsconfig.json          2021-08-09 00:08

3. xargsコマンドとfindコマンドの使用

xargs コマンドは、標準入力からコマンドを実行するために使用されます。 この場合、findコマンドの結果に対してlsやstatなどのコマンドを実行して、ファイルの変更時刻を表示できます。findコマンドで検出されたファイルごとにコマンドを実行できます。コマンドの結果をxargsにパイプすることによって。

スペースを含むファイル名がある場合、xargsのデフォルトの動作はfindコマンドの出力では機能しません。 この問題を解決するには、xargs\nのみを区切り文字として使用するように指示する必要があります。 これは、GNUバージョンのxargsにある-dオプションを使用して実行できます。

同様に、 tr コマンドを使用し、xargsの-0 オプションを使用して、改行文字(\ n)をヌル文字(\ 0)に変換することによってもこれを行うことができます。 コマンド。

xargs を使用して、findによって検出された各ファイルに対してstatコマンドを呼び出す方法を見てみましょう。

$ find . -name "*json*" | xargs -d '\n' stat -c "%-25n %y"
./json-folder             2021-08-23 03:37:42.186944753 +0300
./.eslintrc.json          2021-08-09 00:09:14.666912172 +0300
./file with-space.json    2021-08-23 02:39:25.199162189 +0300
./package.json            2021-08-09 00:08:08.549344419 +0300
./tsconfig.json           2021-08-09 00:08:58.959014859 +0300

xargs を使用して、findによって検出された各ファイルに対してlsコマンドを呼び出すこともできます。

$ find . -name "*json*" | xargs -d '\n' ls -ld
-rw-rw-r--. 1 haben haben 2259 Aug  9 00:09  ./.eslintrc.json
-rw-rw-r--. 1 haben haben 2259 Aug 23 02:39 './file with-space.json'
drwxrwxr-x. 2 haben haben 4096 Aug 23 03:37  ./json-folder
-rw-rw-r--. 1 haben haben 2259 Aug  9 00:08  ./package.json
-rw-rw-r--. 1 haben haben 2259 Aug  9 00:08  ./tsconfig.json

4. findコマンドのexecオプションの使用

findコマンドのexecオプションは、上記のxargsコマンドと同様に使用できます。 ただし、 execオプションを使用すると、xargsよりも遅くなる可能性があり、を読み取るのがより困難になります。 exec オプションを使用して、findコマンドで見つかった各ファイルに対してstatコマンドを実行する方法を見てみましょう。

$ find . -name "*json*" -exec stat -c "%-25n %y" {} \;
./json-folder             2021-08-23 03:37:42.186944753 +0300
./.eslintrc.json          2021-08-09 00:09:14.666912172 +0300
./file with-space.json    2021-08-23 02:39:25.199162189 +0300
./package.json            2021-08-09 00:08:08.549344419 +0300
./tsconfig.json           2021-08-09 00:08:58.959014859 +0300

exec オプションを使用して、findによって検出された各ファイルに対してlsコマンドを呼び出すこともできます。

$ find . -name "*json*" -exec ls -ld {} \;
drwxrwxr-x. 2 haben haben 4096 Aug 23 03:37 ./json-folder
-rw-rw-r--. 1 haben haben 2259 Aug  9 00:09 ./.eslintrc.json
-rw-rw-r--. 1 haben haben 2259 Aug 23 02:39 './file with-space.json'
-rw-rw-r--. 1 haben haben 2259 Aug  9 00:08 ./package.json
-rw-rw-r--. 1 haben haben 2259 Aug  9 00:08 ./tsconfig.json

5. 結論

このチュートリアルでは、findコマンドの検索結果にファイルの変更された日付を含めるさまざまな方法を見てきました。 さまざまな情報を含めるようにfindコマンドの出力をカスタマイズする方法も確認しました。