Linux에서 파일 이름에 날짜가 있는 특정 기준의 파일 삭제

Linux에서 파일 이름에 날짜가 있는 특정 기준의 파일 삭제

아래 언급된 조건으로 폴더에서 모든 파일을 삭제해야 합니다.

파일 이름 패턴: fileNameBeginDateEndDate.txt(YYYYMMDD 형식의 시작 및 종료 날짜)

현재 날짜가 시작 날짜와 종료 날짜 사이에 없는 모든 파일을 삭제해야 합니다.

예를 들어 오늘 날짜가 2018-01-16이라면,

  • 삭제할 파일:File2016010120170101.txt
  • 삭제하면 안되는 파일:File2016010120190101.txt

미리 감사드립니다!

답변1

이 필터는 기준과 일치하는 파일 이름, 즉 삭제해야 하는 파일 이름만 출력합니다.

perl -MTime::Piece -ne 'BEGIN { $now=localtime->ymd("")} ($s,$e)=($_=~m/(\d{8})(\d{8})\./); print $_ if $e lt $now || $s gt $now'

예:

 echo "File2016010120170101.txt" | perl -MTime::Piece -ne 'BEGIN { $now=localtime->ymd("")} ($s,$e)=($_=~m/(\d{8})(\d{8})\./); print $_ if $e lt $now || $s gt $now'
 File2016010120170101.txt
 echo "File2016010120190101.txt" | perl -MTime::Piece -ne 'BEGIN { $now=localtime->ymd("")} ($s,$e)=($_=~m/(\d{8})(\d{8})\./); print $_ if $e lt $now || $s gt $now'
 (nothing)

초기 파일 이름 목록을 얻은 방법에 따라 목록을 전처리한 다음 xargs rm결과를 실행할 수 있습니다.

가능한 한 엄격하게 정규식을 파일에 적용하는 것이 좋습니다. 및/또는 실제로 삭제하기 전에 삭제하려는 파일을 검토하세요.

답변2

find+bash해결책:

find -type f -regextype posix-egrep -regex ".*/File[0-9]{16}\.txt" -exec \
bash -c 'd=$0; f="$1"; [[ $f =~ File([0-9]{8})([0-9]{8})\.txt ]]; 
         [[ "$d" -lt "${BASH_REMATCH[1]}" || "$d" -gt "${BASH_REMATCH[2]}" ]] && rm "$f"' \
         $(date +"%Y%m%d") {} \;

답변3

그리고 zsh:

set -o  extendedglob # best in ~/.zshrc
now=${(%):-%D{%Y%m%d}}
rm ./*[0-9](#c16).txt(e'{! ((now >= REPLY[-20,-13] && now <= REPLY[-12,-5] ))}'))
  • (%)매개변수 확장 플래그, 매개변수 확장을 위한 프롬프트 확장을 켜는 데 사용됩니다.
  • ${:-value}: ${var:-value}Bourne 클래스 확장의 형태에는 가 없으므로 var주어진 value.
  • %D{%Y%m%d}: 이 형식으로 오늘 날짜까지 프롬프트를 확장합니다. 또 다른 방법은 zmodload zsh/datetime; strftime -s now %Y%m%d $EPOCHSECONDS시스템 date명령을 사용하거나 사용하는 것입니다 now=$(date +%Y%m%d).
  • (#c16)Extendedglob 연산자는 이전 원자의 16개와 일치합니다( ksh93의 와 유사 {16}([0-9])).
  • (e:code:):glob 한정자는 코드 평가를 기반으로 파일을 선택하는 데 사용됩니다.
  • REPLY[-20,-13]: 20~13자 카운트다운 $REPLY(확인 중인 파일의 경로를 저장하세요).

관련 정보