Shell
如何查找並列出具有特定文件夾名稱的文件夾,其中包含最近修改的文件?
我有一組定期更新的文件夾,我想定期解析並更新為一個簡單的文本文件列表。此列表與 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
這將查找在路徑中某處具有父目錄的所有新文件,其名稱以
BETA
find 的約定為-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 分隔輸入的工具來閱讀它。