Encontre a pasta mais recente / versão do arquivo e remova - nenhum registro de data e hora

0

Eu tenho dados recuperados de um backup e os dados recuperados têm várias versões das mesmas pastas / arquivos. As pastas / arquivos foram nomeados com _000 _001 _002 etc nos arquivos e pastas. Todos os carimbos de hora modificados são os mesmos. Então as pastas / arquivos parecem com isso

[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  

Algumas dessas pastas são 6 ou mais profundas. O padrão que eu encontrei é que o último arquivo ou versão de pasta para cada pasta / arquivo é o bom e as pastas que são indesejadas estão vazias. O ruim não é que todos os arquivos / pastas tenham o mesmo número de versões. Então, só porque o FILEA.TXT tem 4 versões (FILEA.TXT para FILEA_002.TXT), o FILEB.TXT possui apenas 2 versões (FILEB.TXT & FILEB_000.TXT). Portanto, não posso pesquisar todos os arquivos com _002 e mover ou excluir. Eu era facilmente capaz de excluir todas as pastas vazias indesejadas com bash ( find . -type d -empty -delete ), que cuida de parte do meu problema nas pastas, exceto para renomear de volta.

Eu preciso remover todos os arquivos indesejados e, em seguida, remover os números de versão das pastas / arquivos para que o software possa importar corretamente os dados recuperados. Aqui está um exemplo de um caminho e os arquivos e pastas no caminho.

[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  

Os arquivos e pastas neste caminho para manter seriam

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

... e então eu preciso soltar qualquer _000 _001 _002 etc se existir em cada pasta de arquivos

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

Provavelmente fácil com coisas como sed e pipes, mas não faço ideia.

    
por wade812 02.02.2018 / 05:41

1 resposta

1

Itere em todos os arquivos. Encontre aqueles que também correspondem ao componente _nnn . Identifique o último e exclua os outros.

Se você precisar aplicar em uma árvore de pastas, uma opção é colocar isso em um script e chamar o script de uma construção 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

Remova as declarações echo que precedem a rm -f -- "$version" e a mv -f -- "$keep" "$file" quando estiver satisfeito com a exclusão dos arquivos que você deseja excluir e mantenha os que deseja manter.

    
por 03.02.2018 / 14:58