CLI의 정규식 일치

CLI의 정규식 일치

CLI에 대한 논리와 같은 것이 있습니까? 나는 이 목표를 달성하고 싶다.

mv -t newfolder *.(png|jpg)

모든 jpg 및 png 파일이 새 폴더로 이동됩니다. 나는 이것이 효과가 있다는 것을 안다

mv -t newfolder *.png && mv -t newfolder *.jpg

하지만 항상 구문상의 설탕이 존재하지 않나요?

답변1

큰 타격을 받은 경우:

mv -t newfolder *.@(png|jpg)
  • ?(패턴)은 주어진 패턴이 0개 또는 1개 발생하는 것과 일치합니다.
  • *(패턴)은 주어진 패턴이 0개 이상 일치합니다.
  • +(패턴)은 주어진 패턴과 하나 이상 일치합니다.
  • @(pattern)은 주어진 패턴 중 하나와 일치합니다.
  • !(패턴)은 주어진 패턴 중 하나를 제외한 모든 것과 일치합니다.

extglob 옵션이 필요합니다:

$ shopt extglob
extglob         on

닫혀 있으면 다음 명령을 사용하여 열 수 있습니다.

$ shopt -s extglob

답변2

mv -t newfolder *.(png|jpg)

zsh구문 이지만 다음을 통해 활성화해야 합니다.

setopt extended_glob

엄밀히 말하면 다음과 같이 작성해야 합니다.

mv -t newfolder -- *.(png|jpg)

-그렇지 않으면 일부 파일 이름이 문자로 시작 하면 제대로 작동하지 않습니다 .


mv -t newfolder -- *.@(png|jpg)

문법 입니다 ksh. 옵션( ) zsh을 켜면 bash에서 인식되고, kshglob옵션( )을 켜면 setopt kshglobbash에서 인식됩니다.extglobshopt -s extglob

ksh하지만 이 경우 둘 다 문제에 직면하게 됩니다. 또는 파일이 bash없으면 변경되지 않은 채 로 전달되고 , 해당 이름의 파일이 있으면(일반적이지 않음) 로 이동됩니다 .pngjpg*.@(png|jpg)mvnewfolder

에서는 이 옵션을 켜서 이 문제를 피할 bash수 있습니다 . (최신 버전의 ksh93에만 해당) 당신이 할 수 있는 최선의 방법은 작성하는 것입니다 (이것은 bash 또는 zsh의 와일드카드 한정자와 동일합니다 ) failglob. 일치 하는 파일이 없으면 패턴이 비어 있게 확장되고 그런 다음 오류가 발생합니다 .ksh~(N)*.@(png|jpg)nullglob(N)mv

답변3

Nykakin의 답변그것은 많은 것을 설명합니다. 뭔가 추가하자면 -

에는 정규 표현식과 같은 것이 없습니다 CLI. 항상 그렇습니다globbing당신이 보고 사용하는 것.

이것이 순수한 정규식이라면 .입력할 때 점 []으로 시작하는 파일과 디렉터리가 표시되지 않는 이유는 무엇입니까 ls *? 정규 표현식의 모든 항목과 일치합니까 *? 하지만 글로브의 경우에는 그렇지 않습니다.

답변4

나는 원하는 결과를 얻을 수 있는 정규식이나 멋진 구문 설탕을 모릅니다. 그러나 find를 사용하여 원하는 결과를 얻는 방법은 다음과 같습니다.

find . -maxdepth 1 -mindepth 1 -type f -name '*.png' -o -name '*.jpg' -exec mv -t newfolder {} +

관련 정보