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 kshglob
bash에서 인식됩니다.extglob
shopt -s extglob
ksh
하지만 이 경우 둘 다 문제에 직면하게 됩니다. 또는 파일이 bash
없으면 변경되지 않은 채 로 전달되고 , 해당 이름의 파일이 있으면(일반적이지 않음) 로 이동됩니다 .png
jpg
*.@(png|jpg)
mv
newfolder
에서는 이 옵션을 켜서 이 문제를 피할 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 {} +