Bash 指令從每個資料夾遞歸取得第一個和最後一個文件

Bash 指令從每個資料夾遞歸取得第一個和最後一個文件

我有一個目錄

我的主要目錄是/tmp/folder

裡面/tmp/folder只有 X 個資料夾(不是文件)。例如

/tmp/folder/1
/tmp/folder/2
/tmp/folder/3
/tmp/folder/4
/tmp/folder/5

這些資料夾內有許多具有相同副檔名的檔案。我想從每個資料夾中獲取最後一個和第一個創建的文件(修改時間)。

我比較喜歡這樣的輸出

/tmp/folder/1,OLD_FILE,NEW_FILE
/tmp/folder/2,OLD_FILE,NEW_FILE
/tmp/folder/3,OLD_FILE,NEW_FILE
/tmp/folder/4,OLD_FILE,NEW_FILE
/tmp/folder/5,OLD_FILE,NEW_FILE

我將使用腳本解析此輸出,因此您可以執行任何您想要的輸出,但請以友好的方式執行,以便我可以輕鬆解析它。

bash指令應該只有1

答案1

find "$DIR" -type d | while read d; do echo "$d,$(ls -t "$d" | sed -n '1h; $ { G; s/\n/,/g; p }')"; done

或者,採用更易讀的格式並使用額外的變數進行示範:

find "$DIR" -type d |
while read d;
do
    files=$(ls -t "$d" | sed -n '1h; $ { G; s/\n/,/g; p }')
    printf '%s,%s\n' "$d" "$files";
done

$DIR這會找到使用該命令的所有子目錄find。對於找到的每個文件,用於ls -tr獲取該目錄中按日期排序的文件列表,最新的在前。

將 的輸出透過管道連接ls -trsed用逗號連接第一行和最後一行:選項-n抑制預設輸出,1h將第一行(最新的檔案名稱)保存在保持空間,並在檔案的最後一行(由 選取$)將保留空間(最新的檔案名稱)附加H到模式空間(由換行符號分隔),並將換行符號變更為逗號。

然後,該腳本printf將子目錄名稱後跟一個逗號,然後是來自sed.

這對最舊/最新選擇的目錄和檔案沒有區別,因此如果您不想要目錄,則需要過濾輸出ls -t以刪除目錄。

相關內容