最新のフォルダ/ファイルバージョンの検索と削除 - タイムスタンプデータなし

最新のフォルダ/ファイルバージョンの検索と削除 - タイムスタンプデータなし

バックアップからデータを復元しましたが、復元されたデータに同じフォルダ/ファイルの複数のバージョンがありました。フォルダ/ファイル名は、ファイルとフォルダに_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。最後の項目を識別し、残りの項目を削除します。

フォルダツリーに適用する必要がある場合、1つのオプションはそれをスクリプトに入れて構文からそのスクリプトを呼び出すことです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"削除したいファイルが削除され、保持したいファイルが保持されます。

関連情報