依目錄中檔案的日期字串對目錄進行排序

依目錄中檔案的日期字串對目錄進行排序

我正為此頭痛。我試圖透過該目錄中的檔案來排序多個目錄,該目錄包含備份的建立日期。

這是為了訂購我的備份,我無法使用目錄的 ctime 或 atime 執行此操作,因為它們會同時複製到其他主機。

假設我有以下結構:

/backups/full
/backups/incremental1
/backups/incremental2
/backups/incremental3
...

在這些備份目錄中,我們有:

/backups/full/date.txt
/backups/incremental1/date.txt
/backups/incremental2/date.txt
..

在該date.txt文件中,我們有一個字串:creation_time = 2020-04-03 15:26:19對於每個。

我怎麼能製作一個腳本來按其創建時間字串對這些目錄進行排序並將它們放入數組中,這樣我就可以執行

array=(full incremental1 incremental2 incremental3)

for dir in @{array[@]}; do

我想讓它們在變數或陣列中排序

答案1

假設 的結構date.txt總是相同且目錄名稱不包含換行符,這樣的操作應該可以解決問題:

for d in /backups/*/date.txt; do
    printf '%s\t%s\n' "$(grep creation_time "$d")" "$(basename "$(dirname "$d")")"
done | sort | cut -f2-

輸出:

full
incremental1
incremental2
incremental3

如何將其放入數組中應該相當簡單,但您可能不需要它,因為您可以將結果輸入循環whilexargs類似的內容中。

答案2

使用shelldate.txt中檔案的上次修改時間戳記zsh

for backupdir in /backup/*/date.txt(ome['REPLY=$REPLY:h']); do
    # do whatever you need to do
    # with the directory path in $backupdir
done

這使用通配模式來匹配所有date.txt檔案。模式末尾的 globbing 限定詞會對匹配進行排序,以便最近修改的匹配位於第一個(這就是所做的),並從匹配的路徑名中om刪除字串(就像會做的那樣)。/date.txtdirname

這顯然是假設date.txt在將日期寫入檔案時(大約在進行備份的同時)檔案已更新。如果您使用 複製數據,則將保留此時間戳記(以及目錄時間戳記)rsync --archive

bash

zsh -c '
for backupdir in /backup/*/date.txt(ome['\''REPLY=$REPLY:h'\'']); do
    # do whatever you need to do
    # with the directory path in $backupdir
done'

相關內容