.whl로 끝나는 파일만 찾기

.whl로 끝나는 파일만 찾기

.whl아래와 같이 모든 파일을 캡처하려고 합니다.

ls -l  /python/*.{whl,}
ls: cannot access /python/*.: No such file or directory
-rw-r--r-- 1 root root   23000 Jun 14 11:02 /python/argparse-1.4.0-py2.py3-none-any.whl
-rw-r--r-- 1 root root  154423 Jun 14 11:02 /python/certifi-2019.9.11-py2.py3-none-any.whl
-rw-r--r-- 1 root root  387834 Jun 14 11:02 /python/cffi-1.14.0-cp27-cp27mu-manylinux1_x86_64.whl
-rw-r--r-- 1 root root  133356 Jun 14 11:02 /python/chardet-3.0.4-py2.py3-none-any.whl
-rw-r--r-- 1 root root 2728298 Jun 14 11:02 /python/cryptography-2.9.2-cp27-cp27mu-manylinux1_x86_64.whl
-rw-r--r-- 1 root root   11223 Jun 14 11:02 /python/enum34-1.1.10-py2-none-any.whl
-rw-r--r-- 1 root root   58594 Jun 14 11:02 /python/idna-2.8-py2.py3-none-any.whl
-rw-r--r-- 1 root root   18159 Jun 14 11:02 /python/ipaddress-1.0.23-py2.py3-none-any.whl
-rw-r--r-- 1 root root  125774 Jun 14 11:02 /python/Jinja2-2.11.2-py2.py3-none-any.whl

하지만 보시다시피, 우리는 또한 다음을 얻습니다.ls: cannot access /python/*.: No such file or directory

.로 끝나는 파일만 찾으려면 이 문제를 어떻게 해결해야 합니까?whl

답변1

whl확장자가 있는 파일에만 관심이 있는 경우

ls -l /python/*.whl

그게 당신이 원하는 것입니다.

현재 명령,

ls -l  /python/*.{whl,}

동등하다

ls -l /python/*.whl /python/*.

(감사해요버팀대 확장) 후자의 패턴이 의 어떤 것과도 일치하지 않기 때문에 실패합니다 /python.

답변2

~처럼@StephenKitt가 말했습니다.에서 bash중괄호 확장은 와일드카드 이전에 수행됩니다(그리고 다른 모든 형태의 확장(인수 확장 포함) 이전에도 이것이 bashand 의 내용을 출력하는 유일한 셸인지 확인하세요).echo $P{S1,ATH}$PS1$PATH

ls -l /python/*.{whl,}

동일합니다:

ls -l /python/*.whl /python/*.

그리고 bashBourne 셸에서 상속된 버그 기능은 일치하지 않는 glob이 문자 그대로 명령에 전달된다는 것입니다. 따라서 /python이름이 filename 으로 끝나는 숨김 파일이 아닌 경우 파일 이름 이 전달되고 .해당 파일에 대해 불평합니다(예 ), 이는 Unix에서 전적으로 사실입니다. 유효한 파일 이름)이 존재하지 않습니다. 및 옵션을 사용하면 이 동작이 변경됩니다./python/*.lsls*.failglobnullglob

이제 버팀대 확장 기능은 1970년대 후반 csh에서 나왔습니다. 에서는 오류가 표시되지 않음을 알 수 있습니다 csh.

csh초기 Unices(이름은 glob) 처럼 동작하는 Bourne 쉘의 결함이 없으면 /etc/glob, 일치하지 않는 glob은 (있는 그대로 전달되지 않고) 삭제됩니다.모두명령줄의 glob을 일치시킬 수 없으며 명령이 취소되었습니다(분명히 뭔가 잘못되었으므로 합리적인 조치입니다).

그래서 csh:

ls -l /python/*.{whl,}

먼저 다음으로 확장하세요.

ls -l /python/*.whl /python/*.

in 과 유사 bash하지만 /python/*.일치하는 파일이 /python/*.whl없지만일부파일은 /python/*.삭제되고 ls파일 목록을 사용하여 호출됩니다 .whl.

파일 이 없으면 오류가 .whl발생합니다.No match비악시, 오류 대신통과ls존재하지 않는 파일에 관해서.

zsh복사 중괄호에서 확장되는 또 다른 쉘입니다 csh. 일치하지 않는 글로브의 동작은 다릅니다.

zsh또한 Bourne 쉘의 결함은 없지만(적어도 기본적으로는 아님) 다음과 같은 경우 명령을 취소합니다.어느(대모두csh/ ) glob /etc/glob은 일치하지 않으므로 ls -l /python/*.{whl,}파일이 있어도 ls -l /python/*.whl /python/*.glob이 일치하지 않으므로 실행되지 않습니다. 에서는 를 사용하여 동작을 얻거나 를 사용하여 Bourne 동작(권장되지 않음)을 얻을 수 있습니다. 에서는 with와 비슷한 동작을 얻을 수 있습니다.ls.whl/python/*.zshcshset -o cshnullglobset +o nomatchbashzshshopt -s failglob

쉘은 fish다르게 동작합니다.

fish(최신 쉘)은 zsh실패한 glob 취소 명령처럼 동작합니다. 에서처럼 zsh, 당신은 볼 수 있습니다

ls -l /python/*.whl /python/*.

실행되지 않고 ls다음을 반환합니다.

fish: No matches for wildcard “/python/*.”. See `help expand`.
ls -l /python/*.whl /python/*.
                    ^

실수. 하지만

ls -l /python/*.{whl,}

하다아니요오류 반환, .whl파일 나열 및 실행아니요이 경우처럼 동작 /python/*.하도록 인수를 전달합니다 .lscsh

{x,y}하지만 엄밀히 말하면 와일드카드는 아니더라도 이미 완료되었기 때문입니다.옆에와일드카드이며 전체 중괄호에 걸쳐 완성된 와일드카드가 어떤 파일과도 일치하지 않는 경우에만 명령이 취소됩니다. 파일 *.whl*.파일도 없으면 오류는 다음과 같습니다.

fish: No matches for wildcard “/python/*.{whl,}”. See `help expand`.
ls -l /python/*.{whl,}
      ^

즉, 전체 /python/*.{whl,}가 고려된다.와일드카드여기서는 중괄호 확장으로 와일드카드가 생성되지 않습니다.

.whlor로 끝나는 파일을 나열하려면 .다음을 수행합니다.

ls -ld /python/*(.|.whl)  # zsh
ls -ld /python/*.(|whl)   # zsh
ls -ld /python/*@(.|.whl) # ksh / bash -O extglob
ls -ld /python/*.?(whl)   # ksh / bash -O extglob

즉,글로벌 운영자이내에하나두 개의 glob이 아니라 각 경우에 하나씩 두 glob과 일치합니다( .whl파일을 먼저 나열하려는 경우는 제외하고 lsas 명령의 경우 ls목록을 정렬하는 방법에는 차이가 없습니다).

그러나 Bourne 쉘 버그 기능으로 인해 패턴과 일치하는 파일 이 없는 경우 ksh.failglobbash*.?(whl)

zsh오류로 처리하지 않고 파일을 나열 하려는 경우 ( / 와 같이 두 목록 중 하나가 비어 있는 경우) 이를 로컬로 사용할 수 있습니다.*.whl*.cshfishcshnullglob

(){ set -o localoptions -o cshnullglob; ls -ldU /python/*.{whl,}; }

(이것은 GNU를 가정 ls하고 해당 -U옵션을 사용하여 정렬을 비활성화합니다).

또는 Nglob 한정자를 사용하고( nullglob동작 가져오기) 수동으로 오류 처리를 수행합니다(두 glob이 일치하지 않는 경우).

() {
  if (($#)); then
    ls -ldU -- "$@"
  else
    echo>&2 No match
    return 1
  fi
} /python/*.{whl,}

bash옵션 및 위치 인수의 범위를 제한하기 위해 (익명 함수가 없기 때문에) 서브셸을 사용하여 bash에서 유사한 작업을 수행할 수 있습니다 .

(
  shopt -s nullglob
  shopt -u failglob # failglob takes precedence over nullglob when set!
  set -- /python/*.{whl,}
  if (($#)); then
    ls -ldU -- "$@"
  else
    echo>&2 No match
    exit 1
  fi
)

관련 정보