找昨天到現在有更動的檔案

需求是要找到從昨天到現在有變更的檔案,一時也想不出來怎麼做,利用 Google 找了一下,大多都是利用 find 的 -newer 參數。

find 的 -newer 參數要帶入的是一個檔案,表示會以這個檔案為基準來進行比對。

所以假設是要找 2023-11-11 之後的檔案,就先利用 touch 來建立一個基準檔案,其修改日期為 2023-11-11:

touch --date "2023-11-11" /tmp/base

然後再用

find . -newer /tmp/base -print

就可以找出在 /tmp/base 之後變更的檔案了。

find 也有一個 -newerXY 的參數,這個 XY 可以是以下內容

  1. a – 檔案的存取時間
  2. B – 檔案的建立時間
  3. c – 檔案 inode 的變更時間
  4. m – 檔案的修改時間
  5. t – 參數的內容是時間

那要找比 2023-11-11 要新的檔案,就用以下指令

find . -type f -newermt 2023-11-11

要找特定一天的,就用以下指令

find . -type f -newermt 2023-11-11 ! -newermt 2023-11-12

參考資料

find + egrep

使用 find 多半是用 wildchar 萬用字元來搜尋,使用方法簡單。但有些場景就需要用 regular expression 來找符合特定格式的檔名,這時候 find 可以勝任嗎?

find 指令提供了 -regex 參數,就可以使用此參數來指定格式;搭配的參數是 -regextype ,regular expression 雖說用法大致一樣,但語言難免都有方言存在,因此可以用這個參數來指定要用哪種 regular expression 的方言。

所以若是要在 LOG_DIR 目錄下找符合 app.log.2022-10-11 這樣類型的檔名然後做壓縮,就可以這樣寫:

find "${LOG_DIR}" \
    -type f \
    -regextype 'posix-egrep' \
    -regex '.*app\.log\.[0-9]{4}-[0-9]{2}-[0-9]{2}$' \
    -exec gzip {} \;

說明如下

  1. -regextype 前面說過是指定 regular expression 的方言,可以指定這些 awk, egrep, emacs, gnu-awk, grep, posix-awk, posix-basic, posix-egrep, posix-extended ,這邊我們用 posix-egrep ,確保符合 posix 標準。
  2. -regex 的格式最前面使用了 .* ,這是因為 find 輸出時的檔名會包含 LOG_DIR 路徑,所以必須用 .* 來表示格式之前有可能有任何字元。
  3. egrep 不能用 \d ,必須要用 [0-9] 才行,所以這邊用 [0-9]{4} 表示連續四個數字,[0-9]{2} 表示連續兩個數字。

find 搭配 regex 就可以更有彈性的去找出符合格式的檔名,不需要遷就 wildchar 了。

參考資料

git 不能加空目錄的變通方法

git 沒辦法加空目錄,沒有任何選項可以用。Stackoverflow (How do I add an empty directory to a Git repository? – Stack Overflow) 上提到的變通方法就是為這些空目錄添加一個空白的檔案,檔名看是要用 .gitignore 或是 README 之類的就可以。

那要找所有空目錄的話,該怎麼找?find 就可以做到這點 (參考 bash – finding empty directories unix – Stack Overflow) :

find . -type d -empty -print

那麼,要為每個空目錄加上空白檔案的話,再利用 -exec 參數就可以了:

find . -type d -empty -exec touch {}/README \;