web-dev-qa-db-ja.com

特定のディレクトリで最後に変更されたファイルを再帰的にリストする方法

これは一般的なLinuxの質問かもしれませんが、ここで試してみます。

最近変更されたファイルのリストが非常に頻繁に必要であり、現在、そのためにls出力をgrepにパイプして、今日または特定の時間にパラメーターを指定しますが、grep paramは頻繁に更新されたリストを取得するため、少し非生産的です。

特定のパスで最後に変更されたファイルをリストする簡単なコマンドはありますか?

4
Tiberiu C.

特定のディレクトリから最後に変更された5つのファイルを再帰的に検索するには、そのディレクトリから次を実行します。

find . -type f -printf '%T@ %p\n' | sort -k1,1nr | head -5
  • %T@ with -printfの述語findはファイルのエポック以降の修正時間を取得し、%pはファイル名を出力します

  • sort -k1,1nrはエポック時間に従って結果を数値的に反転しますsort

  • head -5は、最後に変更された5つのファイル名を取得します

現在のディレクトリでのみ(再帰的にではなく)検索する場合は、statを使用します。

stat -c '%Y %n' * | sort -k1,1nr | head -5

またはfind

find . -maxdepth 1 -type f -printf '%T@ %p\n' | sort -k1,1nr | head -5

man findおよびman statを確認して、より多くのアイデアを得てください。

9
heemayl

以下のスクリプトは、ディレクトリ内のすべてのファイルを再帰的にリストし、任意の時間よりも短い時間前に編集します。さらに、最後の編集以降の期間が表示されます。

次のコマンドで使用できます。

findrecent <directory> <time(in hours)>

以下に示すように:

enter image description here

この例では、36時間以内に編集されたデスクトップ上のすべてのファイルがリストされます。

スクリプト

#!/usr/bin/env python3
import os
import time
import sys

directory = sys.argv[1]

try:
    t = int(sys.argv[2])
except IndexError:
    t = 1

currtime = time.time(); t = t*3600

def calc_time(minutes):
    # create neatly displayed time
    if minutes < 60:
        return "[edited "+str(minutes)+" minutes ago]"
    else:
        hrs = int(minutes/60); minutes = int(minutes - hrs*60)
        return "[edited "+str(hrs)+" hours and "+str(minutes)+" minutes ago]"

for root, dirs, files in os.walk(directory):
    for file in files:
        file = os.path.join(root, file); ftime = os.path.getctime(file)
        edited = currtime - ftime
        if edited < t:
            print(file, calc_time(int(edited/60)))

使い方

  1. まだ存在しない場合は、ディレクトリ~/binを作成します
  2. 上記のスクリプトを空のファイルにコピーし、~/binfindrecentとして保存します
  3. スクリプトを実行可能にします
  4. ログアウトしてからログインし直すと完了です

注意

  • 時間が指定されていない場合、スクリプトは過去1時間に編集されたすべてのファイルをリストします
  • ディレクトリにスペースが含まれる場合は、例のように引用符を使用します
3
Jacob Vlijm

実際にはとても簡単です。カラントディレクトリにある最新のファイルを取得するには:

ls -Art | tail -n 2

/ opt/spark /などの別のディレクトリにある最新のファイルを取得するには:

ls /opt/spark/ -Art | tail -n 1

これは、クラスターで使用する場合です。

aa23916@picard03:/opt/spark/applicationHistory$ ls -Art | tail -n 2
app-20180124162809-0004
app-20180124163207-0005.inprogress

シンプルで簡単:)

1
A Alnafessah