나는 다음과 같은 텍스트 파일에 여러 파일 이름을 저장했습니다.new1.txt내 홈 디렉토리에서 이제 루프를 사용하여 파일이 있는 디렉토리의 모든 파일을 나열합니다. 이 작업을 수행하는 명령을 작성할 수 있습니다.
while read in; do ls -lrt /newusr/home/logs/"$in"; done < new1.txt
이 로그들은 어제 생성된 것인데 어제 오후 2시 이후에 생성된 파일을 모두 찾아보고 싶어서 grep 문을 삽입해 보았는데 잘못 쓴 것 같습니다
while read in; do ls -lrt /prdusr/rhd/prdoper/opLogDir/"$in"; done < new1.txt | grep "Dec 18 {14-23}"
. 구문에 문제가 있거나 이를 달성할 수 있는 다른 방법이 있습니까?
답변1
먼저 올바른 타임스탬프를 사용하여 참조 타임스탬프 파일을 만듭니다 mtime
.
touch -d 2019-12-18T14:00 timestamp
그런 다음 파일을 구문 분석하고 각 파일에 대해 파일이 timestamp
방금 만든 파일보다 최신인지 테스트합니다.
while IFS= read -r name; do
if [[ /prdusr/rhd/prdoper/opLogDir/$name -nt timestamp ]]; then
printf 'Updated: %s\n' "/prdusr/rhd/prdoper/opLogDir/$name"
fi
done <new1.txt
이는 -nt
파일 테스트를 사용하여 bash
수정 타임스탬프를 확인합니다( bash
이 테스트는 1초 미만의 정확도로 수행되지 않습니다).
POSIX 도구 사용:
touch -d 2019-12-18T14:00 timestamp
while IFS= read -r name; do
if [ -n "$( find "/prdusr/rhd/prdoper/opLogDir/$name" -newer timestamp )" ]
then
printf 'Updated: %s\n' "/prdusr/rhd/prdoper/opLogDir/$name"
fi
done <new1.txt
이는 반대 방법을 사용하여 테스트합니다 find
. 만약 파일이 file 이후 수정된 경우 timestamp
발견된 경로가 출력되고 쉘은 출력을 비어 있지 않은 문자열로 감지하고 호출합니다 printf
.
답변2
정규 표현식은 숫자 비교가 아닌 텍스트 패턴을 위해 설계되었기 때문에 필터링된 타임스탬프를 사용하여 허용 가능한 시간 범위를 얻는 것은 쉽지 않습니다 grep
(예:이것및 기타 유사한 질문).
귀하의 특정한 경우, 명령문을 다음과 같이 수정할 수 있습니다.
grep -E "Dec 18 (1[4-9]|2[0123])"
grep
그러나 이를 위해서는 GNU 및 "확장 정규식" 구문이 필요하다는 점에 유의하십시오 . 검색에 사용하는 구문리터럴 문자열 {14-23}
출력 라인 에 나타납니다 ls
.
또한 일반적으로 구문 분석의 출력은 다음과 ls
같습니다.적극 권장하지 않음파일 이름에 특이한 문자가 포함되어 있거나 로케일 결과가 다른 타임스탬프 형식 등인 경우 많은 함정이 있기 때문입니다. 예를 들어, 선택한 방법은 지난 1/2 년 정도 내에 발생한 수정 시간을 표시하는 ls
타임스탬프의 관례적인 타임스탬프 에 전적으로 의존합니다. 예를 들어 옵션을 사용하는 Mon DD HH:MM
것이 더 안전합니다 (아마도 ).find
-mtime
-daystart