백업 데이터베이스용 폴더가 있고, 날짜에 관계없이 오전 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
내장된 셸 스크립트에는 파일의 "시간" 타임스탬프를 결정하고 범위에 따라 성공 또는 실패를 반환하는 두 가지 주요 부분이 있습니다. 첫 번째 부분 자체는 두 부분으로 완료됩니다. 이 변수에는 명령 대체 결과가 할당됩니다. 명령은 안쪽에서 바깥쪽으로 읽어야 합니다.
$(stat -c %Y "$1")
-- 이 (두 번째) 명령은 호출을 대체합니다.stat
발견된 경로 이름 중 하나로 지정된 내장 쉘 스크립트에 대한$1
인수 . 이 명령의 %Y 옵션은 에포크 이후의 수정 시간을 초 단위로 반환합니다.$1
find
stat
date -d @ ... +%-H
-- 위의 명령 대체에서 에포크 이후의 초 수를 가져오고date
해당 시간의 시간 부분을 제공하도록 요청합니다.@
통사론date
입력 형식으로 epoch 이후 몇 초가 소요되는지 알려 줍니다.-
날짜 출력 형식의 옵션을 통해 GNU에 날짜를 알려줍니다.아니요값을 앞에 0으로 채웁니다. 이는 향후 8진수에 대한 잘못된 해석을 방지합니다.
$h
Hour 변수를 할당 한 후에는 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