콘텐츠와 파일 이름을 기반으로 특정 파일을 검색하려면 다음 방법을 사용합니다.
find /labels/ -type f -iname '*.*' -exec grep -l 'MB2306' {} +
이제 반환된 파일의 생성 날짜도 알아야 합니다. 이를 달성하려면 여기서 무엇을 변경해야 합니까?
Red Hat Enterprise 8.8의 4.6.0에서 실행 중입니다.
답변1
-files0-from
GNU find
및 최신 버전의 GNU(4.9 이상) grep
또는 호환 버전을 사용하세요.
find /labels/ -type f -name '*.*' -exec grep -Zl MB2306 {} + |
find -files0-from - -prune -printf '%TFT%TT%Tz %p\n'
다른 find
구현이나 GNU 이전 버전의 경우 find
, 그리고 여전히 GNU xargs
와 GNU를 stat
사용할 수 있는 경우:
find /labels/ -type f -name '*.*' -exec grep -Zl MB2306 {} + |
xargs -r0 stat -c '%y %n' --
%T
( %y
for stat
)는 마지막 수정 시간으로, 생성 시간이라고도 볼 수 있습니다.콘텐츠이 파일들. 파일의 생성 시간을 %B
( %w
GNU의 경우)로 바꿀 수 있지만 이는 모든 시스템과 파일 시스템에서 사용할 수 있는 것은 아니며 정확히 원하는 것이 무엇인지에 따라 일반적으로 유용한 측정 기준이 아닙니다.stat
-name '*.*'
( -iname
패턴에 문자가 없기 때문에 별로 의미가 없음) 보고서 이름은 완전히 텍스트로 구성되고 하나 이상의 가 포함되어 있다는 점 에 유의 하세요 .
. .bashrc
파일 이름이 텍스트로 구성되어 있는지 여부에 관계없이 확장자를 가진 파일을 일치시키려면 LC_ALL=C find ... -name '?*.*'
¹가 필요합니다. 이름에 관계없이 파일을 원하면 다음을 생략하면 됩니다 -name pattern
.
find
대부분의 기능은 파일 유형별 재귀 및 필터링을 지원하는 zsh 쉘 의 glob에서 사용할 수 있으며 해당 쉘에서 다음을 수행할 수 있도록 stat
내장되어 있습니다(1997년부터 GNU 이전 ).stat
zmodload zsh/stat
stat -nLF %FT%T.%N%z +mtime ${(0)"$(
grep -lZ MB2306 /labels/**/?*.*(ND.))"}
(여전히 GNU grep
또는 해당 -Z
옵션과 호환된다고 가정하고 여기서는 일반 텍스트 파일 이름으로 제한되지 않습니다.)
이 %FT%T.%N%z
strftime()
사양(여기서는 나노초로 확장됨 ) 또는 이에 상응하는 %N
GNU 사양은 난독화되지 않은 표준 형식을 제공합니다 . 원하는 대로 조정할 수 있습니다. 참조 형식에 대한 자세한 내용을 확인하세요.find
-printf
%TFT%TT%Tz
2023-06-14T10:23:05.047789132+0100
man strftime
GNU stat
형식은 사용자 정의할 수 없지만 for 및 for 를 2023-06-14 10:23:05.047789132 +0100
사용할 수도 있습니다 .%Y
1686734585
%.Y
1686734585.047789132
¹ 이는 파일 내용과 해석 방법 LC_ALL=C
에도 영향을 주지만 grep
여기서 고정 문자열을 찾을 때 아무런 차이가 없어야 하며 속도가 빨라질 수도 있습니다.
답변2
이 find
명령은 AND
모두 예측되므로(predicates 를 사용하지 않는 한 -o
) 추가하고 ls -l --time=creation
(OS가 이를 지원해야 하며 Alma 9.1에서 확인했습니다) 일치하는 파일의 생성 시간 목록을 얻을 수 있습니다.
find /labels/ -type f -iname '*.*' -exec grep -q 'MB2306' {} \; -exec ls -l --time=creation {} \;`
파일이 일치하는지 알아야 하기 때문에 grep
로 변경했습니다 . 일치하면 실행하고, 일치하지 않으면 실행하지 마세요.-q
ls
ls