파일 이름에“2015”로 하루보다 오래된 파일을 나열하는 방법은 무엇입니까?


11

오늘에 속하지 않는 모든 로그 파일과 2015이름에 포함 된 파일 만 나열하고 싶습니다 .

다음은 내가 시도한 명령입니다.

find . -name 2015 -mtime +1 -exec  ls -ltrh  {} \;
find . -name *2015* -mtime +1 -exec  ls -ltrh  {} \;

둘 다의 결과는 아무것도 아니지만 여전히 파일이 있습니다. 이 명령에 문제가 있으며 무엇을 얻지 못했습니다. 도움을 주시면 감사하겠습니다.


find부분은 나에게는 좋아 보이지만 -exec매개 변수에 문제가 있습니다 . 나는 그것을 작동시키지 못했습니다. (저는 모든 jpg 파일을 한 폴더에서 상위 디렉토리로 옮기려고했지만 수동으로 끝냈습니다 ...)
Byte Commander


@steeldriver 나는 그와 함께 현재 디렉토리에있는 파일이 있다면 있기 때문에, 잘못 여기에 무슨 일이 일어나고 있는지 정말 생각 2015나는있을 것입니다 의심 자신의 이름으로 (방법의 다른 명백한 단점 명령이 기록 된) 일부 출력의 종류. 따라서 이에 대한 답변을 게시하고 싶을 수도 있습니다.
Eliah Kagan

답변:


18

명령 find . -name '*2015*' -mmin +1440 -ls은 아마도 당신이 원하는 것을 할 것입니다. 자세한 내용은 아래를 참조하십시오.

첫 번째 명령은 -name 2015이었습니다. 이름이 정확히 다른 파일 이 없는 파일 찾기 때문에 작동하지 않았습니다 . 2015

두 번째 명령 인 find . -name *2015* -mtime +1 -exec ls -ltrh {} \;두 가지 이유로 실패했을 수 있습니다.

1. 인용 부호가없는 *문자는 쉘에서 확장 된 다음로 전달됩니다 find.

이름이 포함 된 (및로 시작하지 않는 ) 이름을 가진 현재 디렉토리 ( find ...명령 을 실행할 때 사용 하는 파일)에 직접 포함 된 파일 이있는 경우 , 은 해당 파일 이름 목록으로 확장 된 후 전달됩니다. 이 목록을에 대한 인수로 사용 합니다. 이것은 당신이 원하는 것이 아닙니다. 대신에, 당신은 문자 그대로 찾기위한 인수로 전달 하여 쉘이 아닌에 일치하는 파일을 찾을 수 있습니다.2015.*2015*find*2015*find

이 문제를 해결하려면을 인용하십시오 *2015*. 이를 수행하는 일반적인 세 ​​가지 방법이 있습니다.

  • '*2015*'(예 find . -name '*2015*' -mtime +1 -exec ls -ltrh {} \;)
  • "*2015*"(예 find . -name "*2015*" -mtime +1 -exec ls -ltrh {} \;)
  • \*2015\*(예 find . -name \*2015\* -mtime +1 -exec ls -ltrh {} \;)

내가 제안 을 쓰는 작은 따옴표와 같은 '*2015*', 때문에 :

그러나이 경우에는 실제로 중요하지 않습니다. '그리고 "모두 치료 *같은과 표현은 충분히 복잡하지 않습니다 \열심히 이해할 수 있도록하기 위해 인용.

2. -mtime +1유일한 선택 파일은 수정 두 개 이상의 일 전.

으로는 man find말한다 :

       Numeric arguments can be specified as

       +n     for greater than n,

       -n     for less than n,

       n      for exactly n.
       -mtime n
              File's data was last modified n*24 hours ago.  See the  comments
              for -atime to understand how rounding affects the interpretation
              of file modification times.
       -atime n
              File was last accessed n*24 hours ago.  When  find  figures  out
              how  many  24-hour  periods  ago the file was last accessed, any
              fractional part is ignored, so to match -atime +1, a file has to
              have been accessed at least two days ago.

파일이 47 시간 전에 수정되었다고 가정하십시오. 얼마나 많은 24 시간입니다 기간 알아낼 find라운드 다운 : 그 것이다 24 시간 전에. 그러나 -mtime +1수정 시간이 24 시간 전에 1 시간 이상인 파일 만 일치합니다 . 따라서 어제의 파일이 일치하지 않습니다.

find -mtime +1이 2 일보다 오래된 파일 만 반환하는 이유를 참조하십시오 . steeldriver 에서 제안한 대로 자세한 내용을 참조하십시오 .

24 시간 전에 언제라도 마지막으로 수정 된 파일을 찾으려면 1440 분 전에 다음을 사용 하여 파일을 지정 하는 것이 좋습니다 -mmin +1440.

find . -name '*2015*' -mmin +1440 -exec ls -ltrh {} \;

일부 독자들은 내가 왜 인용을하지 않았는지 궁금 할 것 {}입니다. 어떤 사람들 {}은 인간에게 그것이 중괄호 확장 의 표현이 아니라는 것을 상기 시키라고 인용 합니다 . Bourne의 스타일 쉘 (같은 bash는 ) 하지 않는 필요 {}아무것도 내부로는 인용한다. Bourne 스타일이 아닌 일부 쉘은 특수하게 처리합니다. 일부 사용자가 인용 한 이유 일 수 있습니다. 그러나 또한 거기에 오해 중 하나는 때때로 인용해야 {}하므로 -exec제대로 공백 핸들 파일 이름은. 즉, S 거짓으로 {}하거나 '{}', find얻는다 같은 쉘로, 인수를 따옴표를 제거 전달하기 전에 '{}'find. 이 오해에 대응하기 위해, 나는 인용하지 않는다 {}, 그러나 그것은 스타일의 문제 - 당신이 원하는 경우 {}쉘이 치료되지 않는 방법을 문서로 {하고 }, 특별히 그의 벌금을.

난 당신이 또한 하나 귀하의 변경 권장 ls명령을, 또는 (로 muru가 제안했다 )로 교체 find-ls작업입니다. 찾은 각 파일에 대해 별도로 실행되므로 정렬을 지정 하는 및 플래그는 관련이 없으므로 ls -ltrh의도 한대로 수행하지 않을 수 있습니다 .-t-r

출력과의 형식이 약간 다르지만 ls -l사용 -ls이 더 간단하고 쉽습니다.

find . -name '*2015*' -mmin +1440 -ls

또는 파일 이름 만 나열하면 (경로에 상대적인 경로 포함 .) 동작을 지정하지 않고 기본 -print동작을 사용할 수 있습니다.

find . -name '*2015*' -mmin +1440

1
좋은 철저한 답변! 적어도 GNU find에는 다음 newerXY과 같은 구문 이 있습니다. 예를 들어 다음 -newermt 'yesterday'과 같은 달력 인수를받습니다.! -newermt 'yesterday'
steeldriver

그거 알아?
@Eliah

감사합니다 stell driver, 그것은 알고있는 링크에서 매우 좋은 정보입니다. 그러나 제 경우에는 응용 프로그램의 응용 프로그램 로그이므로 오래된 파일을 수정할 방법이 없습니다. 다시 감사합니다
rɑːdʒɑ

2

표현을 인용하면 괄호도 인용하십시오.

find . -name "2015" -mtime +1 -exec  ls -ltrh  '{}' \;

또는

find . -name "*2015*" -mtime +1 -exec  ls -ltrh  '{}' \;

찾은 파일을 ls에 전달할 필요가 없습니다.

find . -name "*2015*" -mtime +1

-type f?를 사용하여 제한하십시오 . 그리고 사용해야 ls하는 경우을 사용하는 것이 좋습니다 -ls.
muru

1
모든 좋은 제안. OP가 무엇을 원하는지 잘 모르겠으며 문제의 원인은 "이름"검색 패턴 주위에 따옴표가 부족하다고 생각합니다.
Panther

2

zsh 에서는 glob 한정자를 사용할 수 있습니다 (이것은 고유 한 zsh 기능이며 bash와 같은 다른 셸에서는 사용할 수 없음).

ls -ltr *2015*(m+1)

현재 디렉토리의 파일 만 나열합니다. 디렉토리를 재귀 적 으로 탐색 하려면 다음을 사용하십시오.

ls -ltr **/*2015*(m+1)

find, -name 2015단지 이름이 정확히 파일을 찾습니다 2015. 쉘 이 호출 되기 전에 패턴을 확장하기 때문에 현재 디렉토리에 -name *2015*이름이 포함 2015된 파일이없는 경우에만 작동합니다 . 패턴을 인용해야합니다.*2015*find

find -name '*2015*' -mtime +1 …

모두주의 find -mtime +1와 zsh을의가 *(m+1)있는 파일을 찾을 최소 48 시간 이전은 , 오늘은보다 오래된 파일. 더하기 기호는 "보다 엄격하게"를 의미하며 일 수는 반올림됩니다. 24 시간 이상 지난 파일을 찾으려면 -mtime +0또는을 사용하십시오 (m+0).

어제 또는 이전에 마지막으로 수정 된 파일을 찾으려면 술어find 와 함께 사용할 수 있습니다 .-newermt

find -name '*2015*' ! -newermt 'today 0:00' …

zsh에서이 테스트를 수행하는 편리한 방법은 없습니다.

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