Linux

按此目錄內文件的日期字元串排序目錄

  • April 6, 2020

我為此頭疼。我正在嘗試通過此目錄中包含備份創建日期的文件來訂購多個目錄。

這是為了訂購我的備份,我不能使用目錄的 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:19for each one。

我如何製作一個腳本來通過它們的 creation_time 字元串對這些目錄進行排序並將它們放在一個數組中,這樣我就可以做一個

array=(full incremental1 incremental2 incremental3)

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

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

假設結構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

如何將其放入數組中應該相當容易,但您可能不需要它,因為您可以將結果輸入例如while循環xargs等。

使用shell中date.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

這使用 globbing 模式來匹配所有date.txt文件。模式末尾的 globbing 限定符對匹配項進行排序,以便最近修改的匹配項排在第一位(這就是這樣做的),並從匹配的路徑名om中刪除字元串(就像會做的那樣)。/date.txt``dirname

這顯然是假設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'

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