이 디렉토리에 있는 파일의 날짜 문자열로 디렉토리를 정렬하세요.

이 디렉토리에 있는 파일의 날짜 문자열로 디렉토리를 정렬하세요.

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

이것은 백업을 주문하기 위한 것입니다. 디렉토리의 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.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'

관련 정보