최신 폴더/파일 버전 찾기 및 삭제 - 타임스탬프 데이터 없음

최신 폴더/파일 버전 찾기 및 삭제 - 타임스탬프 데이터 없음

백업에서 데이터를 복원했는데 복원된 데이터에 동일한 폴더/파일의 여러 버전이 있었습니다. 폴더/파일 이름은 파일 및 폴더에 _000 _001 _002 등으로 지정되었습니다. 모든 수정 타임스탬프는 동일합니다. 폴더/파일은 다음과 같습니다.

[PATH  ~/Folder/9] (VERSION 1) EMPTY - and can be deleted  
[PATH  ~/Folder/9_000] (VERSION 2) EMPTY - and can be deleted  
[PATH  ~/Folder/9_001] (VERSION 3) Data is in this last one  

FILEA.TXT (VERSION 1) remove/delete this one  
FILEA_000.TXT (VERSION 2) remove/delete this one  
FILEA_001.TXT (VERSION 3) remove/delete this one  
FILEA_002.TXT (VERSION 4) I need to keep this one and then rename  

FILEB.TXT (VERSION 1) remove/delete this one  
FILEB_000.TXT (VERSION 2) I need to keep this one and then rename  

이러한 폴더 중 일부는 폴더 깊이가 6개 이상입니다. 내가 찾은 패턴은 각 폴더/파일의 마지막 파일 또는 폴더 버전이 좋은 버전이고 원하지 않는 폴더는 비어 있다는 것입니다. 나쁜 점은 모든 파일/폴더의 버전 수가 동일하지 않다는 것입니다. 따라서 FILEA.TXT에는 4가지 버전(FILEA.TXT ~ FILEA_002.TXT)이 있으므로 FILEB.TXT에는 2가지 버전(FILEB.TXT 및 FILEB_000.TXT)만 있습니다. 그래서 모든 파일을 검색할 수 없고 _002이동하거나 삭제할 수 없습니다. bash()를 사용하면 불필요한 빈 폴더를 모두 쉽게 삭제할 수 있는데 find . -type d -empty -delete, 이는 이름 바꾸기 이외의 폴더 관련 문제 중 일부를 해결합니다.

내 소프트웨어가 복구된 데이터를 올바르게 가져올 수 있도록 불필요한 파일을 모두 삭제한 다음 폴더/파일의 버전 번호를 제거해야 합니다. 다음은 경로와 해당 경로에 있는 파일 및 폴더의 예입니다.

[PATH  ~/Folder/9] EMPTY - and can be deleted  
[PATH  ~/Folder/9_000] EMPTY - and can be deleted  
[PATH  ~/Folder/9_001] Data is in this last one  

[PATH  ~/Folder/9_001/62BF7CA1] EMPTY - and can be deleted  
[PATH  ~/Folder/9_001/62BF7CA1_000] EMPTY - and can be deleted  
[PATH  ~/Folder/9_001/62BF7CA1_001] Data is in the last one  

[ FOLDERS/FILES IN "~/Folder/9_001/62BF7CA1_001" ]  

Archive - unwanted deleted it  
Archive_000 - unwanted deleted it  
Archive_001 - unwanted deleted it  
Archive_002 - unwanted deleted it  
Archive_003 - keep  
Documents - unwanted deleted it  
Documents_000 - keep
FolderX - unwanted deleted it  
FolderX_000 - unwanted deleted it  
FolderX_001 - unwanted deleted it  
FolderX_002 - keep
62BF7CA1.PDF - unwanted deleted it  
62BF7CA1_000.PDF - unwanted deleted it  
62BF7CA1_001.PDF - unwanted deleted it  
62BF7CA1_002.PDF - keep  
62BF7CA1.TXT- keep
62BF7CA1.DOC - unwanted deleted it  
62BF7CA1_000.DOC - unwanted deleted it  
62BF7CA1_001.DOC - unwanted deleted it  
62BF7CA1_002.DOC - keep  
62BF7CA1.QIF - unwanted deleted it  
62BF7CA1_000.QIF - unwanted deleted it  
62BF7CA1_001.QIF - unwanted deleted it  
62BF7CA1_002.QIF - keep  

이 경로에 보관할 파일과 폴더는 다음과 같습니다.

Archive_003  
Documents_000  
FolderX_002  
62BF7CA1_002.PDF  
62BF7CA1.TXT  
62BF7CA1_002.DOC  
62BF7CA1_002.QIF  

...그런 다음 각 폴더에 있는 경우 _000 _001 _002 등을 삭제해야 합니다.

Archive  
Documents  
FolderX  
62BF7CA1.PDF  
62BF7CA1.TXT  
62BF7CA1.DOC  
62BF7CA1.QIF  

sed와 파이프 등을 사용하는 것이 쉬울 수도 있지만 잘 모르겠습니다.

답변1

모든 파일을 반복합니다. 이 구성 요소와도 일치하는 항목을 찾으십시오 _nnn. 마지막 항목을 식별하고 나머지 항목을 삭제합니다.

폴더 트리에 적용해야 하는 경우 한 가지 옵션은 이를 스크립트에 넣고 구문에서 해당 스크립트를 호출하는 것입니다 find -type d -exec.

for file in *.*
do
    [[ -d "$file" || $file =~ _[[:digit:]]{3}\. ]] && continue
    echo -n "Considering $file: " >&2

    extn="${file/*.}"
    versions=("$file")
    keep="$file"

    # Look at matching files
    for version in "${file%.$extn}"_???."$extn"
    do
        [[ -f "$version" ]] || continue

        # Save every one. Identify the current last
        versions+=("$version")
        keep="$version"
        echo -n "$version " >&2
    done
    echo "==> keep $keep" >&2

    # Delete them all except the last
    for version in "${versions[@]}"
    do
        [[ "$version" != "$keep" ]] && echo rm -f -- "$version"
    done
    [[ "$keep" != "$file" ]] && echo mv -f -- "$keep" "$file"
done

echo이전 명령문을 제거 rm -f -- "$version"하면 편안해지면 mv -f -- "$keep" "$file"삭제하려는 파일이 삭제되고 보관하려는 파일이 유지됩니다.

관련 정보