
我有一個目錄
我的主要目錄是/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 -tr
到sed
用逗號連接第一行和最後一行:選項-n
抑制預設輸出,1h
將第一行(最新的檔案名稱)保存在保持空間,並在檔案的最後一行(由 選取$
)將保留空間(最新的檔案名稱)附加H
到模式空間(由換行符號分隔),並將換行符號變更為逗號。
然後,該腳本printf
將子目錄名稱後跟一個逗號,然後是來自sed
.
這對最舊/最新選擇的目錄和檔案沒有區別,因此如果您不想要目錄,則需要過濾輸出ls -t
以刪除目錄。