백업에서 데이터를 복원했는데 복원된 데이터에 동일한 폴더/파일의 여러 버전이 있었습니다. 폴더/파일 이름은 파일 및 폴더에 _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"
삭제하려는 파일이 삭제되고 보관하려는 파일이 유지됩니다.