디렉터리에 있는 파일의 특정 하위 집합을 일치시키는 명령을 실행하려고 합니다. 모든 파일에는 이름이 있습니다타임스탬프.jpg, 각 파일 사이에 약 30분 정도 소요됩니다.
기반으로이 질문과 답변echo
, 나는 ( 테스트를 위해) 다음 명령을 생각해냈습니다 .
for x in *([1510852838790,1510898258530]).jpg; do echo $x; done
그러나 이렇게 하면 다음이 출력됩니다(****로 표시된 입력 번호 참고).
1510770572978.jpg
1510770810272.jpg
1510772133873.jpg
1510772378293.jpg
1510772979803.jpg
1510773223237.jpg
1510852838790.jpg****
1510852959075.jpg
1510853079321.jpg
1510853808012.jpg
1510855019583.jpg
1510855380099.jpg
1510855983715.jpg
1510857313787.jpg
1510858282007.jpg
1510858889310.jpg
1510859009339.jpg
1510859253091.jpg
1510870852822.jpg
1510871097118.jpg
1510871335799.jpg
1510871703808.jpg
1510871823158.jpg
1510872311110.jpg
1510872553750.jpg
1510872917378.jpg
1510873159981.jpg
1510875721755.jpg
1510877181978.jpg
1510877301888.jpg
1510878157813.jpg
1510878278033.jpg
1510878522553.jpg
1510879250080.jpg
1510879738575.jpg
1510879859397.jpg
1510880105392.jpg
1510880717151.jpg
1510880957839.jpg
1510881325005.jpg
1510881570373.jpg
1510881811325.jpg
1510882295590.jpg
1510882785823.jpg
1510883275381.jpg
1510885101702.jpg
1510885222385.jpg
1510885711900.jpg
1510887172253.jpg
1510887292977.jpg
1510887538312.jpg
1510888029878.jpg
1510889975298.jpg
1510890221372.jpg
1510890709993.jpg
1510890830832.jpg
1510890951888.jpg
1510891193150.jpg
1510891313575.jpg
1510891922503.jpg
1510892537090.jpg
1510892900397.jpg
1510893021713.jpg
1510893385557.jpg
1510893992777.jpg
1510895212923.jpg
1510895333595.jpg
1510895819713.jpg
1510897039331.jpg
1510897159572.jpg
1510898133110.jpg
1510898258530.jpg****
1510900807071.jpg
1510900927933.jpg
1510902272277.jpg
1510902393272.jpg
1510902998172.jpg
1510903851131.jpg
1510905309558.jpg
1510905557228.jpg
1510907015107.jpg
1510907751301.jpg
1510907877003.jpg
1510907992905.jpg
1510908113731.jpg
1510908598199.jpg
1510908719029.jpg
1510909570015.jpg
1510909811208.jpg
1510909931529.jpg
1510910181722.jpg
1510911388852.jpg
1510911513951.jpg
1510911879905.jpg
1510912727850.jpg
1510913088390.jpg
1510913818319.jpg
1510915397801.jpg
1510917103919.jpg
1510917711228.jpg
1510917832327.jpg
1510917953273.jpg
1510918319775.jpg
1510918803832.jpg
1510918929550.jpg
1510919172181.jpg
1510919293195.jpg
1510919898053.jpg
1510922089190.jpg
1510922579951.jpg
1510923308092.jpg
1510923550590.jpg
1510923793010.jpg
1510925011829.jpg
1510925137958.jpg
1510925987153.jpg
1510927083913.jpg
1510927812212.jpg
1510928298155.jpg
1510928910223.jpg
1510929031559.jpg
1510930370780.jpg
1510930733981.jpg
1510930981902.jpg
1510932080591.jpg
1510932809212.jpg
1510933290952.jpg
1510933903131.jpg
1510935121827.jpg
1510935237921.jpg
1510935725717.jpg
1510937189535.jpg
1510937919235.jpg
1510938283032.jpg
1510938895279.jpg
1510939137978.jpg
1510939501755.jpg
1510939992901.jpg
출력 목록에는 디렉터리의 798개 파일 중 138개의 파일 이름이 포함되어 있지만 첫 번째 입력 번호 앞과 두 번째 입력 번호 뒤에는 추가 파일이 포함되어 있습니다. 왜 그런 겁니까? 이 문제를 어떻게 바로잡을 수 있나요?
답변1
[1510852838790,1510898258530]
문자 집합의 문자와 일치하는 표준 전역 연산자입니다. [ab,c]
일치 a
, b
또는. ,
따라서c
or 와 같습니다 [1510852838790,1510898258530]
. 즉, 합계를 제외한 쉼표나 소수점 이하 자릿수와 일치합니다.[,01235789]
[,0-357-9]
4
6
*(...)
0 이상과 일치하는 Korn 쉘 glob 연산자( 및 에서도 지원됨)입니다 zsh -o kshglob
.bash -O extglob
...
따라서 뒤에 오는 *([1510852838790,1510898258530]).jpg
모든 문자 시퀀스 와 일치합니다.,01235789
.jpg
1510852838790에서 1510898258530 사이의 십진수로 구성된 문자열을 일치시키려면 쉘 <x-y>
의 glob 연산자가 필요합니다 zsh
.
printf '%s\n' <1510852838790-1510898258530>.jpg
링크한 답변은 zsh
쉘의 또 다른 기능(또한 아님 bash
) 인 [x,y]
glob 한정자를 나타냅니다.
glob 한정자는 (...)
이름 기반 조건 외에 몇 가지 조건을 추가하기 위해 glob 끝에 추가되는 부분입니다.
예를 들어, 다음으로 제한 *.jpg(.)
됩니까?*.jpg
일반 파일(디렉토리, 심볼릭 링크, 소켓, FIFO 등은 포함되지 않습니다.)
*.jpg([5,10])
일치하는 파일 목록에서 5~10번째 파일입니다 *.jpg
(어휘순으로 정렬).
zsh glob 한정자 는 kshglob
. ) 옵션(또는 ksh 에뮬레이션 모드 사용)을 사용하여 이를 처리하고 ksh와 유사한 동작을 활성화합니다.kshglob
bareglobqual
emulate ksh
확장된 glob의 s에 해당하는 ksh
것은 다음과 같습니다(glob이 다른 목적으로 사용된다는 점을 제외하면 정규식과 유사합니다).*(x)
zsh
x#
x*
*
bash
<x-y>
glob 연산자와 glob 한정자가 없습니다 . 에서는 bash
다음을 수행할 수 있습니다.
zsh -c "printf '%s\n' <1510852838790-1510898258530>.jpg"
또는 다음을 사용하여 모든 number.jpg
파일을 인쇄하고 출력을 사후 처리 할 수 있습니다 awk
.
shopt -s extglob
printf '%s\n' *([0-9]).jpg |
awk -F. '$1 >= 1510852838790 && $1 <= 1510898258530'
어쨌든, 일련의 숫자에서 공백을 찾으려면 awk
를 사용하는 것이 좋습니다.
다음과 같습니다( 다시 사용으로 돌아가기 zsh
):
print -l <->.jpg(n) | awk -F. '
{diff = ($0 - prev) / 1000 / 60}
NR > 1 && (diff < 29 || diff > 31) {print $0, "diff=" diff}
{prev = $0}'
답변2
파일 이름이 모두 타임스탬프인 경우 산술적 맥락에서 비교할 수 있습니다 (( ))
. 이는 숫자로 명명된 모든 jpg
파일을 가져와서 확장자를 제거하고 상한 및 하한과 비교합니다.
#!/bin/bash
shopt -s extglob
for f in *([0-9]).jpg; do
timestamp="${f%%.*}"
(( "$timestamp" >= 1510852838790 && "$timestamp" <= 1510898258530 )) && echo "$f"
done
exit