Shell-Script

按訪問時間遞歸排序的列表文件+目錄路徑

  • August 21, 2018

我正在做一個 LRU 腳本,但是在處理了 20 個小時之後,我遇到了無法修復的遞歸模式問題。

我只需要一個命令來顯示按訪問時間排序的文件(–time=atime);我也想管理深度,但如果我不能,也沒關係。

  • 主目錄:

    • 文件 1

    • 目錄 1:

      • 文件 1

      • 文件2

      • 子目錄 1:

        • 文件 1
        • 文件 2
    • 目錄 2:

      • 文件 1

      • 文件 2

      • 子目錄 2:

        • 文件 1

        • 文件 2

        • 子目錄 3:

          • 文件 1

我想排除目錄,只是讓文件按訪問時間排序

/主目錄/目錄 1/文件 1

/主目錄/文件 1

/主目錄/目錄 1/子目錄 1/文件 2

/主目錄/目錄 2/子目錄 2/子目錄 3/文件 1

ETC..

有六種非常常用的工具可以解決類似的問題:

  • find, 查找與特定條目匹配的文件或目錄。

-mindepth和選項控制命令在文件系統樹中的-maxdepth深度(相對於指定的名稱,它們始終位於深度 0)。

-type選項對於限制對文件、目錄、符號連結或設備的考慮很有用。

-printf選項非常有用,因為它使命令以所需格式列印出匹配名稱(目錄項)的資訊。我特別喜歡%TY%Tm%Td %TT %p\n,它使用 format 列印最後修改的日期和時間,以及每行上每個匹配項的完整路徑和名稱YYYYMMDD HH:MM:SS.sss PATH。你看,這種格式排序正確。對於最後一次訪問,使用%AY%Am%Ad %AT %p\n,但注意如果使用掛載選項,則根本不記錄訪問時間戳noatime,或者如果使用relatime掛載選項,則僅在修改後的第一次訪問時修改訪問時間戳;因此,最近最少使用的檢查是不可靠的。(然而,最近最少修改的列表非常可靠;使用者可以手動修改時間戳,否則它們會自動維護。)

  • sort對輸出進行排序。

-d-g、和選項定義如何比較項目,並且該-h選項使順序隨機。-M``-n``-R

-r選項可用於反轉排序順序(與上述選項之一一起使用)。

-t選項重新定義了欄位(列)的定義方式;預設情況下,空格(空格和製表符)分隔列。

-k選項可用於定義每行的哪一部分被視為排序鍵;預設情況下,考慮整行。

  • uniq經常在排序後使用,將多個連續的項目合併為一個——這樣就只輸出唯一的行。
  • cut是從輸出中的每一行中僅選擇特定列的最簡單方法。

-f選項選擇要列印的欄位。(預設情況下,最多列印一個欄位(無分隔符)的行;選項-s禁止列印此類行。)

-d選項可用於重新定義欄位的定義;預設情況下,空白單獨的欄位。

  • sed是一個強大的流編輯器,它將正則表達式應用於輸入,根據需要過濾和修改它。
  • awk是 awk 語言的解釋器。awk 腳本基本上是為每一行(或在所有處理之前或之後,或者如果行(或記錄)匹配某些規則)執行的操作、程式碼片段的集合。

這個特殊問題可以在一個簡單的管道中使用上述三個命令來解決:用於find在樹的所需深度查找文件,列印每個文件的可排序日期和時間,以及文件的相對路徑;對輸出進行排序;刪除每一行的日期和時間部分,只留下每一行上每個文件的相對路徑。

引用自:https://unix.stackexchange.com/questions/320061