두 번 사이에 생성된 파일을 삭제하는 방법은 무엇입니까?

두 번 사이에 생성된 파일을 삭제하는 방법은 무엇입니까?

백업 데이터베이스용 폴더가 있고, 날짜에 관계없이 오전 11시부터 오후 3시 사이에 생성된 모든 백업을 삭제하고 싶습니다. 그게 문제입니다!

이 명령은 매우 유용하다고 생각하지만 내 사용 사례에서는 작동하지 않습니다.

find . -type f -newermt '01 nov 2018 00:00:00' -not -newermt '10 nov 2018 00:00:00' -delete

하지만 여기서는 두 날짜 사이에 간격을 두도록 강요합니다! 특정 두 시간 사이에 생성된 백업만 삭제하고 싶습니다.

답변1

태그를 지정했으므로 간단합니다.stat, 파일의 수정 시간을 추출하는 명령과 date주어진 시간에서 시간을 추출하는 GNU 명령을 사용할 수 있습니다 .

find . -type f -exec sh -c '
  h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 11 ] && [ "$h" -lt 15 ]' \
  sh {} \; -ls

결과가 정확해 보이면 다음을 수행하세요.

find . -type f -exec sh -c '
  h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 11 ] && [ "$h" -lt 15 ]' \
  sh {} \; -delete

이 버전에 대한 테스트 실행은 다음과 같습니다 -ls.

$ touch -d 'Wed Sep 12 11:00:01 EDT 2018' 11am
$ touch -d 'Wed Sep 12 12:00:02 EDT 2018' 12pm
$ touch -d 'Wed Sep 12 15:00:03 EDT 2018' 303pm
$ find . -type f -exec sh -c 'h=$(date -d @$(stat -c %Y "$1") +%-H); [ "$h" -ge 11 ] && [ "$h" -lt 15 ]' sh {} \; -ls
1705096    0 -rw-r--r--   1 user group 0 Sep 12  2018 ./11am
1705097    0 -rw-r--r--   1 user group 0 Sep 12  2018 ./12pm

제가 따라온 훌륭한 답변을 작성해 주신 Kusalananda에게 감사드립니다."find"의 -exec 옵션 이해

하고 있으니 참고해주세요아니요시간 범위와 일치하는 파일만 삭제할 수 있도록 파일별로 결과를 원하기 때문에 여기에 {} +버전이 필요합니다 .find-exec

내장된 셸 스크립트에는 파일의 "시간" 타임스탬프를 결정하고 범위에 따라 성공 또는 실패를 반환하는 두 가지 주요 부분이 있습니다. 첫 번째 부분 자체는 두 부분으로 완료됩니다. 이 변수에는 명령 대체 결과가 할당됩니다. 명령은 안쪽에서 바깥쪽으로 읽어야 합니다.

  1. $(stat -c %Y "$1")-- 이 (두 번째) 명령은 호출을 대체합니다.stat발견된 경로 이름 중 하나로 지정된 내장 쉘 스크립트에 대한 $1인수 . 이 명령의 %Y 옵션은 에포크 이후의 수정 시간을 초 단위로 반환합니다.$1findstat
  2. date -d @ ... +%-H-- 위의 명령 대체에서 에포크 이후의 초 수를 가져오고 date해당 시간의 시간 부분을 제공하도록 요청합니다.@통사론date입력 형식으로 epoch 이후 몇 초가 소요되는지 알려 줍니다. -날짜 출력 형식의 옵션을 통해 GNU에 날짜를 알려줍니다.아니요값을 앞에 0으로 채웁니다. 이는 향후 8진수에 대한 잘못된 해석을 방지합니다.

$hHour 변수를 할당 한 후에는 bash의 조건부 연산자를 사용하여 [[값이 11보다 크거나 같고 15보다 작은지 묻습니다.

답변2

이상적이지는 않지만 이것이 효과가 있을 수 있습니다.

find . -type f -print | while read l; do
    hour=$(stat -c "%z" ${l} | awk '{print $2}' | awk -F: '{print $1}')
    if [[ 11 -le ${hour} ]] && [[ ${hour} -le 15 ]]; do
      rm -f ${l}
    done
done

관련 정보