Bash

列出每個子文件夾的最新文件

  • April 26, 2016

我有一個文件結構:

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目前FOLDERdirectoryname)目前最新的最後修改時間。表達式是true如果還沒有儲存的最後修改時間,directoryname或者如果已經儲存的最後修改時間比目前的時間早SUBFOLDER。 當後面的表達式為真時,最後修改時間和名稱FOLDER都使用directoryname密鑰分別儲存到lmtimeslmtimedns中。

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

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