'찾기'를 사용하여 특정 날짜에 작성된 파일을 검색하는 방법은 무엇입니까? [닫은]


254

UNIX 명령 find을 사용하여 특정 날짜에 작성된 파일을 검색 하려면 어떻게합니까 ?


8
bash 스크립팅 질문이 허용되는 것 같습니다.
Alan

@ MichaelScheper : 나는 그 의견으로 어디서부터 시작 해야할지조차 모른다.
궤도에서 가벼움 경주

1
@Notinlist : 여기에 대답 : meta.stackexchange.com/questions/10249/...는 불행하게도, 그것은 시간 제한이 만료 밝혀졌습니다. 안타깝게도 웹 검색은 여전히 ​​여기에 있으며, 많은 사람들에게 도움이되었습니다.
Michael Scheper

@MichaelScheper : unix.stackexchange.com으로 마이그레이션하기 위해 투표 할 수있는 옵션이 있다면 꼭 알려주세요. 당신이 있기 때문에 하지 않는 닫기 대화 상자를 볼 수있는 담당자를 가지고, 나는 당신에게 힌트를 줄 것이다 : 하나 없다. 무슨 말을하는지 모른다면 덜 전투적인 자세를 취하십시오. 주목 해 주셔서 감사합니다.
궤도에서 가벼움 경주

5
@LightnessRacesinOrbit : 'combative'로 와서 죄송합니다. 내 의견을 편집 할 수는 없지만 나중에 참조 할 수 있도록 귀하를 화나게 한 질문을 칭찬하는 것이 나의 의견입니까? 나는 당신의 이전 의견을 의심의 여지가 주신 후에도 조금 눈이 멀었습니다. : 나는 실제로 어떻게 마이그레이션 작업까지보고, 또 다른 '나 너무'추가하는 것보다 더 건설적인 노력했다 meta.stackexchange.com/a/10250/249555 60 일 시간 제한 가죽이 옵션 아마도를? 범퍼가 미안하다. 시간과 관심에 대해 진심으로 다시 한 번 감사드립니다.
Michael Scheper

답변:


323

Max가 지적한 것처럼, 할 수는 없지만 수정되거나 액세스 된 파일을 확인하는 것이 그렇게 어려운 것은 아닙니다. 나는 오늘 늦게 이것에 대한 자습서 를 썼습니다 . 사용의 본질은 다음 -newerXY! -newerXY같습니다.

예 : 2007 년 6 월 7 일에 수정 된 모든 파일을 찾으려면 다음을 수행하십시오.

$ find . -type f -newermt 2007-06-07 ! -newermt 2007-06-08

2008 년 9 월 29 일에 액세스 된 모든 파일을 찾으려면 다음을 수행하십시오.

$ find . -type f -newerat 2008-09-29 ! -newerat 2008-09-30

또는 같은 날에 권한이 변경된 파일 :

$ find . -type f -newerct 2008-09-29 ! -newerct 2008-09-30

파일에 대한 권한을 변경하지 않으면 'c'는 일반적으로 작성 날짜와 일치합니다.


7
내 버전의 find (GNU 4.2.32)가 -newerXY 조건자를 지원하지 않는 것 같습니다. 특정 최소 버전이 필요합니까? 아니면 특별한 구성 스위치로 찾기를 컴파일하는 경우입니까?
yukondude

1
@ yukondude : 당신이 맞아요. 내가 찾은 로컬 버전-GNU 4.4.0-버전이 있지만 Dreamhost에있는 4.1.20 버전은 그렇지 않습니다. 두 파일을 만드는 kludge는 어느 쪽이든 작동해야합니다.
Arve

1
일부 시스템 (FreeBSD의, OS / X는 ...) -newerBt파일의에 일치 탄생 (창조) 시간.
Stephane Chazelas

3
참고는 것을 -newerxt볼 수 있습니다 FreeBSD의 (가 처음 제공 한 2001 년 이후 패치로 1998 년), 몇 가지 다른 BSD의와 GNU 찾기 도입 HP / UX의 발견을 기반으로, (2007 년 4.3.3 이후) -newerXY(단, Y == t는 지원되지 않습니다).
Stephane Chazelas

사용 : find (GNU findutils) 4.4.0에서이 구문은 SUSE ext3에서 작동하지 않습니다. 해당 날짜에 파일 /
wmtime

68

find location -ctime time_period

time_period의 예 :

  • 30 일 이상 전에 : -ctime +30

  • 30 일 전 : -ctime -30

  • 정확히 30 일 전 : -ctime 30


7
문제는 특정 기간이 아닌 특정 날짜를 테스트하고 싶다는 것입니다.
sverrejoh

1
며칠 전인지 알아 낸 다음 그 숫자를 사용하십시오.
jmanning2k

15
ctime생성 시간 과 관련이 없으며 inode 변경 시간입니다.
Stephane Chazelas

47

두 단계이지만 다음과 같이하고 싶습니다.

먼저 특정 날짜 / 시간으로 파일을 작성하십시오. 이 경우 파일은 자정에 2008-10-01입니다.

touch -t 0810010000 /tmp/t

이제 우리는 위의 파일보다 최신이거나 오래된 모든 파일을 찾을 수 있습니다 (파일 수정 날짜 기준). -anewer 를 사용 하여 액세스하고 -cnewer 파일 상태를 변경할 수도 있습니다.

find / -newer /tmp/t
find / -not -newer /tmp/t

터치하여 두 파일을 만들어 특정 날짜 사이의 파일을 볼 수도 있습니다.

touch -t 0810010000 /tmp/t1
touch -t 0810011000 /tmp/t2

이것은 두 날짜와 시간 사이에 파일을 찾을 것입니다

find / -newer /tmp/t1 -and -not -newer /tmp/t2

3
나쁘지 않은 노인 find을 위한 해결책에 +1-newerXY
Felipe Alvarez

1
IMO, 지금은 이것이 허용되는 솔루션이어야합니다. 새로운 커널은 물론 2.6.18-348.18.1.el5 커널에서 -newermt를 실행할 수 없었습니다.
DarkForce

DarkForce와 마찬가지로, newermt 기능은 매우
놀랍습니다.

34

당신은 이것을 할 수 있습니다 :

find ./ -type f -ls |grep '10 Sep'

예:

[root@pbx etc]# find /var/ -type f -ls | grep "Dec 24"
791235    4 -rw-r--r--   1 root     root           29 Dec 24 03:24 /var/lib/prelink/full
798227  288 -rw-r--r--   1 root     root       292323 Dec 24 23:53 /var/log/sa/sar24
797244  320 -rw-r--r--   1 root     root       321300 Dec 24 23:50 /var/log/sa/sa24

이것은 대부분의 사람들이 원하는 것이지만 충분한지지를받지 못했습니다 !!!
sjas

2
한 디렉토리에 몇 백만 개의 파일이 있으면 작동하지 않을 수 있습니다.
Dennis Nolte

3
grep 검색어가 파일 이름에 있으면 부작용이 있습니다.
Snorex

mywiki.wooledge.org/ParsingLs - 더 나은 방법은 아마 아마로, 기계가 판독 할 수있는 형식으로 작성 날짜를 인쇄하는 것입니다 stat당신이없는 경우 find -printf.
tripleee

12

당신은 할 수 없습니다. -c 스위치는 사용 권한이 마지막으로 변경된시기를 알려주고 -a는 가장 최근 액세스 시간을 테스트하며 -m은 수정 시간을 테스트합니다. 대부분의 Linux 버전 (ext3)에서 사용하는 파일 시스템은 "작성 시간"레코드를 지원하지 않습니다. 죄송합니다!


7
실제로 이것은 파일 시스템 유형이 아니라 파일 시스템이 보유한 경우에도 그러한 정보를 얻기위한 시스템 인터페이스가 없습니다. 유닉스의 결함 중 하나는 초기로 거슬러 올라갑니다. 이것이 유닉스가 결코 이륙하지 않는 이유입니다.
chrisdowney 2018 년

1
유닉스는 절대 이륙하지 않습니까?
lucid_dreamer

8

@Max : 생성 시간이 맞습니다.

당신이 중 하나에 대한 경과 일 인수를 계산하려는 경우에는, -atime, -ctime, -mtime매개 변수는 다음과 같은 표현을 사용할 수 있습니다

ELAPSED_DAYS=$(( ( $(date +%s) - $(date -d '2008-09-24' +%s) ) / 60 / 60 / 24 - 1 ))

"2008-09-24"를 원하는 날짜로 바꾸면 ELAPSED_DAYS가 그 때부터 오늘까지의 일 수로 설정됩니다. (업데이트 : 결과에서 하나를 빼서 find날짜 반올림 에 맞 춥니 다 .)

따라서 2008 년 9 월 24 일에 수정 된 파일을 찾으려면 명령은 다음과 같습니다.

find . -type f -mtime $(( ( $(date +%s) - $(date -d '2008-09-24' +%s) ) / 60 / 60 / 24 - 1 ))

버전이 @Arve :의 답변에 언급 된 술어를 find지원하지 않는 경우 작동합니다 -newerXY.


2

-atime, -ctime 및 -mtime 스위치를 사용하면 원하는 결과를 얻을 수 있습니다.


-3
cp `ls -ltr | grep 'Jun 14' | perl -wne 's/^.*\s+(\S+)$/$1/; print $1 . "\n";'` /some_destination_dir

1
왜 파일을 복사합니까? `ls ...`작동 중인 명령 외에도 find도구를 사용하지 않습니다 .
Yamaneko

-5

14 일보다 오래된 모든 파일을 삭제하는 스크립트에서이 스크립틀릿을 찾았습니다.

CNT=0
for i in $(find -type f -ctime +14); do
  ((CNT = CNT + 1))
  echo -n "." >> $PROGRESS
  rm -f $i
done
echo deleted $CNT files, done at $(date "+%H:%M:%S") >> $LOG

나는 약간의 추가 "man find"와 -ctime / -atime 등의 매개 변수를 찾는 것이 여기에 도움이 될 것이라고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.