특정 타임스탬프가 있는 텍스트 파일에 저장된 파일 이름 나열

특정 타임스탬프가 있는 텍스트 파일에 저장된 파일 이름 나열

나는 다음과 같은 텍스트 파일에 여러 파일 이름을 저장했습니다.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

관련 정보