/home/download/file
Linux에는 다음 파일이 있습니다.
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:40
month-day-year
05-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:SS
bash 대신 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'])