이것 때문에 머리가 아프네요. 백업 생성 날짜가 포함된 해당 디렉터리의 파일을 기준으로 여러 디렉터리를 정렬하려고 합니다.
이는 백업을 주문하기 위한 것입니다. 동시에 다른 호스트에 복사되므로 디렉토리의 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
이것을 배열에 넣는 방법은 매우 간단하지만 결과를 루프 등으로 공급할 수 있으므로 아마도 필요하지 않을 것 while
입니다 xargs
.
답변2
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
와일드카드 패턴을 사용하여 모든 파일을 일치시킵니다 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'