디렉토리에 있는 파일의 날짜 문자열을 기준으로 디렉토리 정렬

디렉토리에 있는 파일의 날짜 문자열을 기준으로 디렉토리 정렬

이것 때문에 머리가 아프네요. 백업 생성 날짜가 포함된 해당 디렉터리의 파일을 기준으로 여러 디렉터리를 정렬하려고 합니다.

이는 백업을 주문하기 위한 것입니다. 동시에 다른 호스트에 복사되므로 디렉토리의 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.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'

관련 정보