列出每個子文件夾的最新文件
我有一個文件結構:
FOLDER/SUB_FOLDER/Text_File
我有超過 1k+
FOLDER
,每個都有FOLDER
至少 2 個不同SUB_FOLDER
的。SUB_FOLDER``Text_File
我正在嘗試挑戰自己以生成最新
Text_File
的列表FOLDER/
(作為根)My Pseudo code is (as well as commands I know right now): List all FOLDERS - **ls -t [EACH_FOLDER] | head -n1 ** **ls -t EACH_FOLDER/SUB_FOLDER/** **ls Text_File**
輸出應該是:
/FOLDER/SUB_FOLDER/Text_File
…
全部文件。
我的目標是:我需要從每個根目錄中查找每個 LATEST Text_File以從中
FOLDER
解析資訊。
你
gnu
可以嘗試:find "$(pwd)" -mindepth 2 -maxdepth 2 -type d -printf "d%h\0%T@ %p\0" | awk -v RS="\0" ' /^d/ {directoryname=substr($0,2)} /^[0-9]/ && (!lmtimes[directoryname] || lmtimes[directoryname] < $1) { lmtimes[directoryname]=$1; lmtimedns[directoryname]=substr($0,index($0," ")+1); } END {for (directoryname in lmtimedns) print lmtimedns[directoryname]} '
此版本已針對包含特殊字元的怪異名稱進行了測試:
\n
"
等。
$(pwd)
執行pwd
列印目前目錄的絕對路徑名的命令。
find $(pwd)
搜尋目前目錄,將列印完整的目錄路徑名過濾器
-mindepth 2 -maxdepth 2 -type d
僅選擇第二級FOLDER
的目錄,目前目錄位於第 1 級,而它們SUB_FOLDER
位於第 2 級。
-printf "d%h\0%T@ %p\0"
列印每個SUBFOLDER
找到的資訊,以下資訊:
d
FOLDER
\0
last modif time in second since EPOCH
[space]
SUBFOLDER
\0
等等
\0
不能是名稱的一部分,因此這是完美的分隔符。
awk -v RS="\0"
正在考慮\0
作為記錄分隔符。
/^d/ {directoryname=substr($0,2)}
:regex
當記錄以d
;開頭時,這是真的directoryname
由於.FOLDER
_d
_printf
/^[0-9]/
:regex
當記錄以數字開頭時,這是正確的。通過構造,多虧了printf
,目前記錄的第一個欄位($1
: 例如直到[space]
̀ char)包含最後修改時間。
&& (!lmtimes[directoryname] || lmtimes[directoryname] < $1)
: lmtimes是一個關聯數組(一個 Map$$ key,value $$對)。用於儲存
SUBFOLDER
目前FOLDER
(directoryname
)目前最新的最後修改時間。表達式是true
如果還沒有儲存的最後修改時間,directoryname
或者如果已經儲存的最後修改時間比目前的時間早SUBFOLDER
。 當後面的表達式為真時,最後修改時間和名稱FOLDER
都使用directoryname
密鑰分別儲存到lmtimes和lmtimedns中。
END {for (...
:當所有記錄都被解析後,SUBFOLDER
列印每個具有最新最後修改時間的名稱。對於歷史命令,列出每個目錄的最近修改時間的文件名:
find "$(pwd)" -depth -type f -printf "d%h\0%T@ %p\0" | awk -v RS="\0" ' /^d/ { directoryname=substr($0,2); } /^[0-9]/ { if (!lmtimes[directoryname] || lmtimes[directoryname] < $1) { lmtimes[directoryname]=$1; lmtimefns[directoryname]=substr($0,index($0," ")+1); } } END { for (directoryname in lmtimefns) { print lmtimefns[directoryname]; } }'
#!/bin/bash # Array of root folders folders=("a" "b") # Search all specified root folders for f in ${folders[@]}; do # Descend hierarchy and retrieve modification date of each file with "stat" find $f -type f -exec stat -f "%m,%N" {} ';' | \ # sort by date, most recent first sort -gr | \ # extract first (most recent) file head -1 | \ # return file name only cut -d, -f2 done