이것 때문에 머리가 아프네요. 백업 생성 날짜가 포함된 이 디렉터리 내에 있는 파일을 기준으로 여러 디렉터리를 주문하려고 합니다.
이것은 백업을 주문하기 위한 것입니다. 디렉토리의 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
이 디렉토리를 Creation_time 문자열로 정렬하고 배열에 배치하는 스크립트를 어떻게 만들 수 있습니까?
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
이는 모든 파일을 일치시키기 위해 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'