디렉터리에서 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_count
12보다 큰 파일 수 계산ls --format single-column
파일은 단일 열에 오름차순으로 나열됩니다.head
가장 오래된 파일 가져오기rm
제거하다