“find”를 사용하여 두 날짜 사이에 파일을 찾는 방법은 무엇입니까?


21

60GB의 전자 메일을 통과 한 전자 메일 계정이 있는데 현재 전자 메일 클라이언트를 사용하여 작년 (2011 년) 전자 메일을 보관하는 데 많은 문제가 있습니다.

터미널을 통해 2011-01-01과 2011-12-31 사이의 파일을 찾기 위해 find 를 사용하려고 하지만 아무 소용이 없습니다.

두 날짜 사이에 파일을 찾으려면 어떻게해야합니까?

관련이있는 경우 최종 목표는 발견 된 각 파일을 날짜 간격과 일치하는 폴더로 이동하는 배치입니다.


@EliahKagan 당시에 메모리가 제공된다면 중복 된 이름은 문제가되지 않았습니다. 그럼에도 불구하고 시간이 있다고 피드를 보내면 주어진 주제에 대한 추가 정보가 항상 높이 평가됩니다.
Zuul

@EliahKagan이 경우, 여러분이 강조한 실질적인 안전 장치에 대한 답변을 제공해 주시기 바랍니다 :)
Zuul

답변:


16

이 스크립트를 사용할 수 있습니다 :

#!/bin/bash
for i in $(find Your_Mail_Dir/ -newermt "2011-01-01" ! -newermt "2011-12-31"); do
  mv $i /moved_emails_dir/
done

6
파일 이름에 공백이없는 경우를 제외하고는 다음과 같은 findfor루프 에서 출력을 처리해서는 안됩니다 . -exec, -execdir또는 -print0 | xargs보통 대신 사용해야합니다. 일반적으로 훨씬 덜 바람직하지만 for루프를 사용할 수있는 또 다른 가능한 솔루션 IFS은 공간이 필드 구분 기호로 인식되지 않도록 임시로 설정 하는 것입니다.
Eliah Kagan

@EliahKagan 그래서 다음과 같은 명령보기는 것 : 그냥 교체 find와 함께 exec? 공백 사용에 대한 답변을 추가 하시겠습니까?. ?? 매우 감사.
SherylHohman

3
@SherylHohman 아니요, exec명령을 사용하지 마십시오 . 내가 게시 한 답변에 설명 된대로 작업을 실행 하는 find명령 이나 실행해야 할 모든 명령을 사용하십시오 . ... 가 찾은 경로 이름으로 명령을 실행할 때 쉘을 사용하지 않으므로 공백은 단어 분할 또는 globbing을 트리거하지 않습니다 . (귀하의 특정 사건에 대해 새로운 질문을 게시하거나 알고 싶은 내용을 정확하게 묻고 싶을 수도 있습니다.)-execmvfind-exec
Eliah Kagan

죄송합니다 @EliahKagan, 난 당신의 게시물을 오해 - 그것은에서 것을 당신 ! 당신은 굉장합니다! 귀하의 게시물은 훌륭합니다 .. 읽는 데 내 자신의 오류 였지만 응답 해 주셔서 감사합니다!
SherylHohman

40

Bash는 두 날짜 사이의 파일을 찾습니다.

find . -type f -newermt 2010-10-07 ! -newermt 2014-10-08

2010-10-07 이후 및 2014-10-08 이전에 타임 스탬프가있는 파일 목록을 반환합니다.

Bash는 15 분 전부터 지금까지 파일을 찾습니다.

find . -type f -mmin -15

15 분 전부터 지금까지 타임 스탬프가있는 파일 목록을 반환합니다.

Bash는 두 타임 스탬프 사이에서 파일을 찾습니다.

find . -type f -newermt "2014-10-08 10:17:00" ! -newermt "2014-10-08 10:53:00"

사이의 타임 스탬프를 사용하여 파일을 반환 2014-10-08 10:17:00하고2014-10-08 10:53:00


10

중복 이름이있을 때 파일을 이동하고 사용자에게 프롬프트합니다.

Subv3rsionEric Leschinski의 답변 에서 알 수 있듯이 -newermt술어는 피연산자로 지정된 날짜 (및 선택적 시간)보다 최근에 수정 된 파일을 선택합니다. 파일을 찾으려면

  • 어디서나 srcdir(즉, 등 하위 디렉토리, 그 하위 디렉토리 포함)
  • 예를 들어 2014 년 9 월에 마지막으로 수정 된 날짜
  • 그것들destdir

... 당신은 실행할 수 있습니다 :

find srcdir -type f -newermt 2014-08-31 ! -newermt 2014-09-30 -exec mv -i {} destdir/ \;

에서 -exec표현 발견은 자리에서 볼 수있는 파일 이름을 전달합니다 {}. ;-exec실행될 명령과 해당 인수가 모두 제공 되었음을 나타냅니다 (특정 -exec술어의 인수 를 찾기 위해 후속 표현식이 전달되는 경우 -아래 예 참조). 쉘에서 특별히 해석하지 않기 때문에 ;이스케이프 처리해야합니다 \;. (이 없다면 \, ;전체 끝낼 것입니다 find줄 바꿈과 같은 작업, 명령을.이 비록 find명령이이 후 아무것도없는 -exec표현을 통과하지 못한 ;인수가 여전히 구문 오류입니다.)

파일을 나열하고 싶을 경우 (이전 이메일 저장 방법 또는 다른 파일이 있는지 확실하지 않은 경우 권장) 생략 -exec하고 오른쪽에있는 모든 것을 생략 하십시오. (이메일의 경우 종종 다른 날짜의 이메일이 동일한 파일에 저장 됩니다. 여기 질문에 설명 된 상황에있는 사람의 경우 파일을 이동하기 전에 파일이 저장되는 방법을 조사하는 것이 좋습니다.) 이름을 인쇄하고 이동하려면 그들 -print앞에 추가하십시오 -exec.

mv -i 대상에서 파일을 덮어 쓸 때마다 다음과 같은 메시지가 표시됩니다.

  • 이전 백업에 동일한 이름의 파일이 있거나
  • 이름이 같지만 다른 하위 디렉토리의 파일이 srcdir동일한 find작업 중에 이미 이동 했거나
  • (최소한) 동일한 이름의 파일이 원본이 이동 한 후 다른 하위 디렉토리를 통과하면 곧 발견 될 수있을 정도로 srcdir동일한 find작업 중에 어딘가에 작성 되었습니다 find.

호출하는 다른 방법 rm:

중복 이름을 가진 파일을 처리하는 방법에 대한 다른 옵션이 있습니다.

  • 없이 -i(즉, ), 승인하지 일반적으로 프롬프트 것이지만, 대상 파일이 읽기 전용 있다면 그렇게 할 것입니다. ( 파일을 실행하는 사용자가 파일을 소유하는 경우와 같이 읽기 전용 파일을 덮어 쓰는 경우도 있습니다.)mv {} destdir/mvmv
  • 그런 정도의 상호 작용을 원하지 mv않고 항상 같은 이름의 파일을 덮어 쓰려고 시도하려면을 사용하십시오 mv -f.
  • 반대로 동일한 이름의 대상 파일이 이미있는 경우 소스 파일을 건너 뛰려면을 사용하십시오 mv -n.
  • mv-b--backup플래그를 수락하여 대상에 이미 존재하는 동일한 이름의 파일 이름을 자동으로 바꿉니다. 기본적으로 ~백업 이름을 생성하기 위해 추가되며 이름이있는 파일과 백업 이름이있는 파일이 대상에 이미 존재하면 백업 파일을 덮어 씁니다. 이 기본값은를 호출 할 때 전달 된 옵션 mv및 환경 변수에 의해 재정의 될 수 있습니다 . 자세한 man mv내용과 아래 예를 참조하십시오.

이름이 중복되는 경우 파일 이동 및 백업 생성 :

모든 파일을 이동하려면 ~접미사를 사용하여 이름이 중복 된 파일을 백업하고 파일이 이미 존재하는 경우 번호가 붙은 접미사를 사용 하여 덮어 씁니다..~n~.~

find srcdir -type f -newermt 2014-08-31 ! -newermt 2014-09-30 -exec mv --backup=existing {} destdir/ \;

이름이 중복 된 파일을 건너 뛰고 어떤 파일을 알고 싶은 경우 :

당신이 사용하는 경우 mv -n와 같은 이름의 다른 파일이 때문에 이동하지 된 파일을 알고 싶어, 가장 좋은 방법은 원래의 실행 아마 find하지 않고 명령을 다시 -exec그것의 오른쪽에있는 모든 것을. 이름이 인쇄됩니다.
또한 원래 find .... -exec ...명령 을 실행 한 이후 생성 된 일치하는 파일의 이름도 인쇄 하지만이 응용 프로그램의 경우 수정 시간이 오래된 파일을 찾기 때문에 일반적으로 아무것도 없습니다. 실제 나이보다 오래된 수정 타임 스탬프 touch및 기타 메커니즘을 파일에 제공 할 수 있지만이 경우에는 사용자 모르게 발생하지 않는 것 같습니다.

중복 이름으로 인해 파일을 건너 뛰면서 즉시 알기 :

mv -n파일 이동을 억제 할 때보고 하거나 특별한 종료 코드를 반환하지 않습니다 . 따라서 find실행 중에 건너 뛴 파일에 대해 즉시 알리려면 별도의 단계를 수행해야합니다. 한 가지 방법은 다음과 같습니다.

find srcdir -type f -newermt 2014-08-31 ! -newermt 2014-09-30 -exec mv -n {} destdir/ \; \
    -exec [ -f {} ] \; -exec printf "\`%s' skipped (exists in \`%s')\\n" {} destdir \; 

몇 가지 사소한 기술적 고려 사항 : mv대상에 존재하는 것과 다른 이유로 파일을 복사하지 못하고 보고 성공을 종료 하면 잘못 경고 합니다 . 그럴 것 같지는 않지만 불가능하다고 확신하지는 않습니다. 또한 경쟁 조건을 겪을 수도 있습니다 . 이전 파일을 이동 한 후 매우 짧은 시간 동안 동일한 이름의 새 파일이 동일한 위치에 생성 된 경우 실제 오류가 전혀없는 경우 경고 메시지가 표시됩니다. 제거되었는지 확인하십시오. (응용 프로그램을 고려할 때 문제가 실제로 발생하지 않을 것입니다.) 대상을 확인하기 위해 다시 작성할 수 있습니다. 전에 하기이후 대신 파일 이동 : 경쟁 조건은 소스 파일 대신 새로 작성된 대상 파일과 관련됩니다. 오류 및 경고가보고있는 동안 그리고 findmv(또는 [기록됩니다, 어떤이 안하지만) 표준 오차 , 우리의 ...skipped (exists in...경고가 기록됩니다 표준 출력 . 일반적으로 둘 다 터미널에 표시되지만 스크립팅하는 경우 문제가 될 수 있습니다.

더 쉽게 읽을 수 있도록 해당 명령을 두 줄로 나누었습니다. 그런 식으로 실행하거나 \및 줄 바꿈을 제거 할 수 있습니다 (즉, 줄 바꿈).

find명령 은 어떻게 작동합니까?

find술어는 테스트 (예 : -type-newermt), 리턴 값에 사용되거나 조치 (예 : -print-exec)이며 종종 부작용에 사용됩니다.

식 사이에 연산자 (예 : -afor , -ofor 또는 )가 제공 되지 않으면 -a내포됩니다. find채용 단락 평가를 위해 그리고또는 . (즉, )는 pq 표현식이 모두 true 인 경우에만 true이므로 p 가 false 인 경우 q를 평가할 필요가 없습니다 . 우리는 종종 이러한 용어로 생각하지 않지만, 후속 조치 또는 테스트를 평가하기 위해 테스트가 참이되어야하는 이유입니다. 예를 들어, 디렉토리에 있다고 가정하십시오 . false로 평가 되므로 나중에 모든 것을 건너 뛸 수 있습니다.p qp -a qfind-type f

테스트와 마찬가지로 작업도 true 또는 false로 평가됩니다. 이러한 방식으로, -exec실행 된 명령이보고 성공 (true) 또는 실패 (false)를 종료했는지보고합니다. 이 -exec표현 체인은 암시 적 다음 연결되어 있습니다 .

-exec mv -n {} destdir/ \; -exec [ -f {} ] \; -exec printf "\`%s' skipped (exists in \`%s')\\n" {} destdir \;

파일 이동을 시도하고 mv실패 하면 보고가 중지됩니다. 다른 문제로 인해 파일이 이동되지 않은 경우 올바르게 건너 뛴 파일에 대해 경고하지 않습니다.

그러나 성공 하면 [명령 을 실행 합니다 . 마찬가지로 find, [인수로 전달 표정의 자신의 종류를 지원합니다. [ -f {} ]검사 후 피연산자 경우 -f(하여 전달 find대신은 {}) 존재 (및 일반 파일), 반환하거나 참 / 성공 또는 false / 실패.
(많은 명령의 종료 상태는 성공 또는 실패를 나타내는 것으로 가장 잘 해석되지만, [존재 상태는 일반적으로 true 또는 false로 가장 잘 해석됩니다.)

경우 [false를 반환, 다음 파일은 이동 그래서, 그래서 아무것도 할 필요가 없습니다, 사라 졌어요. 그러나 [false를 반환하면 파일이 여전히 존재합니다. 그런 find다음 다음 -exec표현식을 평가하여 경고 메시지를 인쇄합니다.

추가 자료


내가 시간을 얻을 때, 나는 성능 고려 사항에 대해과 섹션을 추가 희망 -exec ... +과 함께 mv -t언젠가 곧.
Eliah Kagan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.