Grep은 날짜와 시간이 포함된 파일을 파일 이름으로 선택합니다.

Grep은 날짜와 시간이 포함된 파일을 파일 이름으로 선택합니다.

/home/download/fileLinux에는 다음 파일이 있습니다.

Abc_05-29-2022_12:30:01
Abc_05-29-2022_12:40:01
Abc_05-29-2022_12:50:02
Abc_05-29-2022_12:45:01
Abc_05-29-2022_12:35:01
Abc_05-30-2022_12:30:01
Abc_05-30-2022_12:35:01
Abc_05-30-2022_12:40:01
Abc_05-30-2022_12:20:01
Abc_05-30-2022_12:50:01

bash 스크립트를 사용하여 선택한 파일을 grep하고 해당 파일을 다른 위치로 복사하고 싶습니다.

  • 소스 경로:/home/Download/files
  • 목적지: /home/test

abc_29-05-22_12:40:0[1-2]예를 들어, 에서 까지의 파일을 grep하고 싶습니다 abc_30-05-22_12:20:0[1-2]. 쉘 스크립트를 사용하여 이 파일을 다른 경로에 복사하십시오.

답변1

이와 같은 도구 grep는 숫자 제약(날짜)을 기반으로 파일을 선택하는 데 적합하지 않습니다. 정규식은 빠르게 복잡해지고 유지 관리가 어려워질 수 있습니다. 숫자 비교가 가능한 경우에는 grep이 아닌 다른 스크립트 언어가 필요합니다. 이 경우 수정 날짜를 볼 수 있지만 이름을 기준으로 파일을 선택하는 데 어려움이 있으므로 find올바른 도구가 아닙니다 .

또한 귀하의 질문에 날짜 형식이 일부 일치하지 않습니다. 예 , 아니면 day/month/year( ) ?29-05-22_12:40month-day-year05-29-2022

-또한 날짜 명령은 일반적으로 슬래시( ) 대신 대시( )를 사용하는 형식을 인식하지 못합니다 ./

따라서 일부 조정을 통해 이 스크립트는 요구 사항을 충족해야 합니다.

#!/bin/bash --

dirsource="/home/Download/files"
dirdestin="/home/test"

filestart="$( date -ud '2022/05/29 12:40' +'%s' )"
fileend="$(   date -ud '2022/05/30 12:20' +'%s' )"

while IFS="" read line; do
    IFS="_-" read name month day year time <<<"$line"
    filenow="$(date -ud "$year/$month/$day $time" +"%s")"
    if [[ $filenow -ge $filestart ]] && [[ $filenow -le $fileend ]]; then
        echo \
        mv "$dirsource/$line" "$dirdestin/$line"
    fi
done <./infile

echo \원하는 대로 작동할 것이라는 확신이 들면 실제로 명령을 실행하는 줄을 제거하십시오.

답변2

Abc_mm-dd-yyyy_HH:MM:SSbash 대신 zsh glob을 사용하여 2022-05-29T12:40:01에서 2022-05-30T12:20:02(형식이 있는 경우)까지 날짜를 나타내는 이름의 파일을 복사하려면 다음을 수행할 수 있습니다.

set -o extendedglob
cp /home/download/file/*(e['
  [[ $REPLY:t = (#b)Abc_(<1-12>-<1-31>)-(<->)_(<0-23>:<0-59>:<0-59>) &&
     ${t::=$match[2]-$match[1]T$match[2]} >= 2022-05-29T12:40:01 &&
     $t <= 2022-05-30T12:20:02 ]]']) /home/test/

우리는 yyyy-mm-ddTHH:MM:SS이러한 타임스탬프를 어휘적으로 비교할 수 있는 표준 형식으로 재배열합니다.

다음과 같은 도우미 함수를 체크인할 수도 있습니다.

range() {
  set -o localoptions -o extendedglob
  local match t
  [[ $REPLY:t = (#b)*_(<1-12>-<1-31>)-(<->)_(<0-23>:<0-59>:<0-59>) &&
     ${t::=$match[2]-$match[1]T$match[2]} >= $1 && $t <= $2 ]]
}

그런 다음:

cp /home/download/file/Abc*(e['range 2022-05-29T12:40:01 2022-05-30T12:20:02'])

관련 정보