각 파일 이름 그룹의 파일 수가 >N인 경우 XML 파일 삭제

각 파일 이름 그룹의 파일 수가 >N인 경우 XML 파일 삭제

디렉터리에서 XML 백업 파일인 파일 끝에 추가된 날짜를 기준으로 파일을 삭제하고 싶습니다. 파일은 다음 기준에 따라 삭제되어야 합니다.

각 세트에 12개 이상의 파일(각 특정 백업 파일 세트의 이름)이 포함된 경우 오래된 파일은 삭제되고 최신 파일은 동일한 디렉터리에 유지되어야 합니다.

세트 1:
Wf_ABCDEF_HGD_AFFGF_DFDF_201601011224.XML

노트:위 그룹 1의 파일은 삭제하면 안 됩니다.

세트 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

다음 파일은 첨부일 기준으로 오래된 것이므로 삭제하시기 바랍니다.

Wf_ABHGD_AFFGF_DFDF_201101211221.XML
Wf_ABHGD_AFFGF_DFDF_201202211222.XML
Wf_ABHGD_AFFGF_DFDF_201304411223.XML
Wf_ABHGD_AFFGF_DFDF_201406611224.XML
그룹 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

이 그룹의 파일 개수는 12개 이하이므로 위 파일을 삭제하면 안 됩니다.

답변1

그리고 find그리고배쉬 오프셋 확장${parameter:offset:length}, 다음과 같이 할 수 있습니다.

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

${#@}총 파일 수(또는 평균 매개변수)를 반환합니다 .

-name위의 find 명령 옵션에 패턴을 지정하여 가지고 있는 각 파일 세트에 대해 반복합니다.

또는 스크립트를 통해 스키마를 가져옵니다.

# !/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

어떤 파일이 삭제되는지 테스트하고 확인하려면 (명령에서 printf) 을 변경하세요 rm.find ...

답변2

다음 코드는 모든 시나리오를 수행해야 합니다.

3가지 시나리오 모두 하나의 조건만 충족합니다. 백업 파일 수가 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디렉토리에서 사용 가능한 파일 수를 얻습니다.
  • if삭제 프로세스는 파일 수가 12보다 큰 경우에만 시작됩니다.
  • REMOVE_count12보다 큰 파일 수 계산
  • ls --format single-column파일은 단일 열에 오름차순으로 나열됩니다.
  • head가장 오래된 파일 가져오기
  • rm제거하다

관련 정보