Exclua os arquivos XML quando N arquivos contarem para cada conjunto de nomes de arquivos

0

Em um diretório, gostaria de excluir os arquivos com base na data anexada no final do arquivo, esses arquivos são arquivos XML de volta. Os arquivos devem ser excluídos com base nos critérios abaixo.

Em cada conjunto, se contiver arquivos com mais de 12 (por conjunto específico de arquivos de backup em seu nome), exclua os arquivos antigos, os arquivos mais recentes devem permanecer no mesmo diretório.

Exemplos

Set 1:
Wf_ABCDEF_HGD_AFFGF_DFDF_201601011224.XML

NOTA: O arquivo acima no conjunto 1 não deve ser excluído.

Set 2:
Wf_ABHGD_AFFGF_DFDF_201101211221.XML   
Wf_ABHGD_AFFGF_DFDF_201202211222.XML   
Wf_ABHGD_AFFGF_DFDF_201304411223.XML   
Wf_ABHGD_AFFGF_DFDF_201406611224.XML   
Wf_ABHGD_AFFGF_DFDF_201508811225.XML   
Wf_ABHGD_AFFGF_DFDF_201609911226.XML   
Wf_ABHGD_AFFGF_DFDF_201707711227.XML   
Wf_ABHGD_AFFGF_DFDF_201801081228.XML   
Wf_ABHGD_AFFGF_DFDF_201901911229.XML   
Wf_ABHGD_AFFGF_DFDF_202001811210.XML   
Wf_ABHGD_AFFGF_DFDF_202101511211.XML   
Wf_ABHGD_AFFGF_DFDF_202201811212.XML   
Wf_ABHGD_AFFGF_DFDF_202301811213.XML   
Wf_ABHGD_AFFGF_DFDF_202401911214.XML   
Wf_ABHGD_AFFGF_DFDF_202501041215.XML   
Wf_ABHGD_AFFGF_DFDF_202601031216.XML

Os arquivos abaixo devem ser excluídos, pois são arquivos antigos com base na data de acréscimo do arquivo.

Wf_ABHGD_AFFGF_DFDF_201101211221.XML
Wf_ABHGD_AFFGF_DFDF_201202211222.XML
Wf_ABHGD_AFFGF_DFDF_201304411223.XML
Wf_ABHGD_AFFGF_DFDF_201406611224.XML
Set 3: -
Wf_ABCDEFGHIJKLMONM_201101211221.XML   
Wf_ABCDEFGHIJKLMONM_201202211222.XML   
Wf_ABCDEFGHIJKLMONM_201304411223.XML
Wf_ABCDEFGHIJKLMONM_201406611224.XML   
Wf_ABCDEFGHIJKLMONM_201508811225.XML   
Wf_ABCDEFGHIJKLMONM_201609911226.XML   
Wf_ABCDEFGHIJKLMONM_201707711227.XML   
Wf_ABCDEFGHIJKLMONM_201801081228.XML   
Wf_ABCDEFGHIJKLMONM_201901911229.XML   
Wf_ABCDEFGHIJKLMONM_202001811210.XML   
Wf_ABCDEFGHIJKLMONM_202101511211.XML

Os arquivos acima não devem ser excluídos, pois esse conjunto é igual ou inferior a 12 arquivos.

    
por surajreddy2 16.08.2018 / 05:28

2 respostas

0

Com find e Expansão de deslocamento do Bash ${parameter:offset:length} , você poderia fazer:

find -type f -execdir bash -c 'printf "%s\n" "${@:1:${#@}-12}" ' _ {} +
./Wf_ABHGD_AFFGF_DFDF_201101211221.XML
./Wf_ABHGD_AFFGF_DFDF_201202211222.XML
./Wf_ABHGD_AFFGF_DFDF_201304411223.XML
./Wf_ABHGD_AFFGF_DFDF_201406611224.XML

O ${#@} está retornando o número total de arquivos (ou argumentos em média).

repita acima para cada conjunto de arquivos que você tenha especificando o padrão na opção -name do comando find acima.

Ou para obter padrões por script:

# !/bin/bash

allFILEs=(*.XML)
PATTERNs=$(printf "%s\n" "${allFILEs[@]%_*}" |sort -u)

for pattern in ${PATTERNs[@]};
do
    find -type f -name "*${pattern}*" -execdir bash -c '
        printf "%s\n" "${@:1:${#@}-12}"' _ {} + 2>/dev/null;
done

altere printf com rm (no comando find ... ) quando você testou e veja quais arquivos estão sendo excluídos.

    
por 16.08.2018 / 08:18
0

O código a seguir deve fazer todo o cenário:

Todos os 3 do seu cenário caíram em apenas uma condição, precisamos excluir os arquivos mais antigos se a contagem de arquivos de backup for maior que 12

cd /path/to/dir
FilePattern=('ls --format single-column *.XML | rev | cut -d '_' -f2-  | rev | sort -u')

for FILE in ${FilePattern[@]}
do
    File_count='ls "$FILE"_*.XML | wc -w'
    if [ $File_count -gt 12 ]; then
        REMOVE_count='expr $File_count - 12'
        ls --format single-column "$FILE"_*.XML | head -n $REMOVE_count |  xargs rm -f
    fi
done
  • File_count irá obter o número de arquivos disponíveis no diretório
  • if o processo de remoção é iniciado apenas se a contagem de arquivos for maior que 12.
  • REMOVE_count calcula a contagem de arquivos maiores que 12
  • ls --format single-column listará arquivos em uma única coluna em ordem crescente.
  • head para obter os arquivos mais antigos
  • rm para remover
por 16.08.2018 / 07:39