Linux에서 지난 달에 수정된 파일을 찾는 방법은 무엇입니까?

Linux에서 지난 달에 수정된 파일을 찾는 방법은 무엇입니까?

한 디렉터리에서 지난 달에 수정된 파일을 찾아서 다른 디렉터리에 복사해야 하는데, 이 명령을 사용하면 지난 달에 수정된 파일이 아닌 지난 31일 동안 수정된 파일만 찾을 수 있습니다.

/usr/bin/find $SOURCE_DIR -maxdepth 1 -type f -name 'files*.pdf' -mtime -31 -exec cp -p {} $DEST_DIR`date +"%B_%Y"` \;

지난 달에 수정된 파일이 필요합니다. 예: 1월, 2월에 수정된 파일... 제안 사항이 있으신가요?

답변1

@SmileDeveloper는 올바른 방향으로 가고 있지만 매우 까다로운 것으로 판명되었습니다.

$ cd "$(mktemp --directory)"
$ touch --date="$(date --date="$(date --rfc-3339=date | cut --characters=-7)-01 - 1 day" --rfc-3339=second)" last-day-of-last-month
$ touch --date="$(date --date="$(date --rfc-3339=date | cut --characters=-7)-01 - 1 second" --rfc-3339=second)" end-of-last-month
$ touch --date="$(date --rfc-3339=date | cut --characters=-7)-01" start-of-current-month
$ touch --date="$(date --date="$(date --rfc-3339=date | cut --characters=-7)-01 + 1 month - 1 second" --rfc-3339=second)" end-of-current-month
$ touch --date="$(date --date="$(date --rfc-3339=date | cut --characters=-7)-01 + 1 month" --rfc-3339=second)" start-of-next-month
$ stat --printf '%y\t%n\n' ./* | sort --key=1
2020-06-30 00:00:00.000000000 +1200 ./last-day-of-last-month
2020-06-30 23:59:59.000000000 +1200 ./end-of-last-month
2020-07-01 00:00:00.000000000 +1200 ./start-of-current-month
2020-07-31 23:59:59.000000000 +1200 ./end-of-current-month
2020-08-01 00:00:00.000000000 +1200 ./start-of-next-month
$ find . -mindepth 1 -newermt "$(date --rfc-3339=date | cut --characters=-7)-01 - 1 second" -not -newermt "$(date --rfc-3339=date | cut --characters=-7)-01 + 1 month - 1 second"
./end-of-current-month
./start-of-current-month

기본적으로 last 명령은 이전 달의 마지막 초(제외)부터 이번 달의 마지막 초(포함)까지의 범위를 제공합니다. find대부분의 프로그래밍 언어와 달리 포괄적인 시작 날짜 시간과 배타적 종료 날짜 시간을 선택하는 방법이 없는 것 같기 때문에 절대적인 정밀도를 원한다면 더욱 추악해질 수 있습니다.

시간대에 대해 걱정할 필요가 없기를 바랍니다!

답변2

이번 달(첫 번째 날부터 시작)

/usr/bin/find $SOURCE_DIR -maxdepth 1 -type f -name 'files*.pdf' -newermt "$(date +%y-%m-1)" -exec cp -p {} $DEST_DIR`date +"%B_%Y"` \;

지난달 1일부터 현재까지

/usr/bin/find $SOURCE_DIR -maxdepth 1 -type f -name 'files*.pdf' -newermt "$(date -d "$(date +%y-%m-1) - 1 month" +%y-%m-%d)" -exec cp -p {} $DEST_DIR`date +"%B_%Y"` \;

지난달 1일부터 지난달 말일까지:

/usr/bin/find $SOURCE_DIR -maxdepth 1 -type f -name 'files*.pdf' -newermt "$(date -d "$(date +%y-%m-1) - 1 month" +%y-%m-%d)" -not -newermt "$(date +%y-%m-1)" \;

편집하다:

에서 수정된 파일 검색은 해당 날짜의 시작 시간에 시작되지 않으므로 mtime사용 하지 마십시오 .mtime24*n

답변3

find -printf이것저것 많이 사용하는 것 같아요 .

$ which month_files
month_files () {
        find . -type f -printf "%TY-%Tm\t%p\n" | grep ^$1 | cut -f2
}

# example run on my ~/.cache directory
$ month_files 2020-05 | wc
   1007    1007   49917

이제 이 파일로 원하는 모든 작업을 수행할 수 있습니다. 예를 들어,

mkdir /target/2020-05
month_files 2020-05 | xargs -d"\n" -I % cp % /target/2020-05/

강제(한 줄에 한 번 실행) 명령과 관련하여 다음 방법을 사용하여 효율성을 높일 수 있습니다 -I.-L 1cp

month_files 2020-05 | xargs -d"\n" cp --target-directory /target/2020-05/

파일 이름에 개행 문자가 없다고 가정합니다. 나는 내 시스템에서 이런 말도 안되는 소리를 실제로 지원하지 않습니다. 공백과 일부 특수 문자는 하나이고 줄 바꿈은 또 다른 것입니다. (또는 Ian Fleming에게 사과하면서 "공간은 우연이고 특수 문자는 우연입니다.개행 문자적의 행동이다!)

관련 정보