Shell

如何查找並列出具有特定文件夾名稱的文件夾,其中包含最近修改的文件?

  • June 17, 2016

我有一組定期更新的文件夾,我想定期解析並更新為一個簡單的文本文件列表。此列表與 rsync 一起使用,因此我使用 sed 縮短文件名以便於同步。

它們的設置幾乎是這樣的:

  • 軟體文件夾

    • 軟體版本_1

      • 版本_1.1

        • 一些文件
      • 版本_BETA

        • 一些文件
    • 軟體版本_2

      • 版本_2.2

        • 一些文件
      • 版本_BETA

        • 一些文件

我試過類似的東西:

for dir in `find -maxdepth 2 -type d -name '*BETA'`; do test `find $dir -type f -mtime -1` | echo $dir | sed "s|^\./||" >> list.txt; done

但輸出仍然列出所有 BETA 文件夾(並在.aspx文件上給出“未知操作數”錯誤?)。

如果腳本在找到至少一個修改過的文件並更新文件夾列表後可以移動到下一個文件夾,那將是一個好處,這樣它就不必遍歷每個文件夾的其余文件。

要查找所有*BETA包含新文件的目錄 ( -mtime -1) 並將這些目錄名稱保存在 中list.txt,請嘗試:

find -type f -path '*BETA/*' -mtime -1 | sed 's|^\./||; s|BETA/.*|BETA|' | sort -u >list.txt

由於您的目標是在文件中創建換行符分隔的數據list.txt,這必須意味著您不希望任何目錄或文件的名稱本身包含換行符。如果他們這樣做了,那麼當然需要不同的輸出格式。

這個怎麼運作

  • find -type f -path '*BETA/*' -mtime -1

這將查找在路徑中某處具有父目錄的所有新文件,其名稱以BETAfind 的約定為-mtime -1.

  • sed 's|^\./||; s|BETA/.*|BETA|'

這會./從文件名中刪除首字母,並刪除BETA. 結果是 BETA 目錄的名稱。

  • sort -u

創建的目錄列表sed將有重複項。這將刪除重複項。

  • >list.txt

這將輸出保存在list.txt

更通用的解決方案

即使目錄或文件的名稱中有換行符,以下方法也是安全的(這可能需要 GNU 工具):

find -type f -path '*BETA/*' -mtime -1 -print0 | sed -z 's|^\./||; s|BETA/.*|BETA|' | sort -zu >list.out

這將創建一個文件,該文件list.out具有以 nul 分隔的形式的目錄名稱。由於 nul 字元永遠不會出現在文件或目錄名中,因此這是一種安全的方法。要使用list.out,您當然需要使用能夠理解 nul 分隔輸入的工具來閱讀它。

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