whl 파일의 패키지 이름을 얻으려고 합니다.
이러한 파일은
ls /python/*.whl
/python/argparse-1.4.0-py2.py3-none-any.whl /python/Jinja2-2.11.2-py2.py3-none-any.whl
/python/certifi-2019.9.11-py2.py3-none-any.whl /python/kazoo-2.2.1-py2.py3-none-any.whl
/python/cffi-1.14.0-cp27-cp27mu-manylinux1_x86_64.whl /python/MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl
/python/chardet-3.0.4-py2.py3-none-any.whl /python/protobuf-3.0.0-py2.py3-none-any.whl
-..........whl
다음 예와 같이 예상되는 출력은 (none )이어야 합니다.
ls /python/*.whl | SOME SYNTAX ......
/python/argparse /python/Jinja2
/python/certifi /python/kazoo
/python/cffi /python/MarkupSafe
/python/chardet /python/protobuf
위의 패키지 이름만 얻는 방법에 대한 아이디어가 있습니까?
답변1
첫 번째,파싱되지 않음ls
. 대신 glob을 사용하세요.
$ for f in /python/*.whl; do printf '%s\n' "${f//-*}"; done
/python/argparse
/python/certifi
/python/cffi
/python/chardet
/python/Jinja2
/python/kazoo
/python/MarkupSafe
/python/protobuf
-
이렇게 하면 경로의 첫 번째 항목 이후의 모든 내용이 삭제됩니다. 따라서 -
패키지 이름 앞에 가 있으면 잘못된 결과를 얻을 수 있습니다.
답변2
두 가지 방법이 있습니다. 매개변수 대체를 사용하여 이름이 포함된 배열의 첫 번째 대시 뒤에 있는 파일 이름 비트를 제거하거나 루프에서 각 이름의 파일 이름 비트를 개별적으로 제거합니다.
배열을 사용하십시오:
$ names=( /python/*-*.whl )
$ printf '%s\n' "${names[@]%%-*}"
/python/Jinja2
/python/MarkupSafe
/python/argparse
/python/certifi
/python/cffi
/python/chardet
/python/kazoo
/python/protobuf
또는 명명된 배열 대신 위치 인수를 사용합니다.
set -- /python/*-*.whl
printf '%s\n' "${@%%-*}"
루프를 사용하십시오.
$ for name in /python/*-*.whl; do printf '%s\n' "${name%%-*}"; done
/python/Jinja2
/python/MarkupSafe
/python/argparse
/python/certifi
/python/cffi
/python/chardet
/python/kazoo
/python/protobuf
저는 일치하는 이름에 실제로 파일 이름을 자르는 데 사용할 수 있는 대시가 포함되어 있는지 확인하기 위해 /python/*-*.whl
파일 이름을 일치시키는 패턴을 사용하고 있습니다 ./python/*.whl
매개변수 대체는 값에서 ${variable%%pattern}
가능한 가장 긴 부분 문자열 일치를 제거하는 표준 대체입니다. 쉘은 또한 배열 요소에 대한 이러한 대체를 허용합니다(위의 첫 번째 변형에서 사용됨).pattern
$variable
bash
생성된 열과 동일한 유형의 열을 얻으려면 ls
결과 이름을 파이프하십시오 column
. 예를 들어 다음과 같습니다.
$ for name in /python/*.whl; do printf '%s\n' "${name%%-*}"; done | column
/python/Jinja2 /python/certifi /python/kazoo
/python/MarkupSafe /python/cffi /python/protobuf
/python/argparse /python/chardet
답변3
단방향, 루프 없음:
printf '%s\n' python/*.whl | cut -d'-' -f1
답변4
그리고 zsh
:
print -rC1 /python/*-*.whl(Ne['REPLY=${REPLY%%-*}'])
또는:
() { print -rC1 "${@%%-*}"; } /python/*-*.whl
또는:
set -o histsubstpattern
print -rC1 /python/*-*.whl(N:s/-*//)