다양한 버전의 deb 디렉토리 목록이 있습니다. 내 요구 사항은 일치하는 버전의 패키지를 찾는 것입니다.
내가 지금까지 시도한 것은 다음과 같습니다.
ls debs/* | grep 1.1.16 | egrep -e 'Package1|Package2|package3'
위 명령은 Package1의 o/p만 제공합니다.
모두 시도했다옵션여기에서. 그러나 그들 중 누구도 도와주지 않았습니다.
답변1
첫 번째,구문 분석하지 않음에 대한 일반 경고ls
. 즉, 파일 이름이 적절하게 지정되었다고 가정하면 다음과 같이 할 수 있습니다.
ls debs/*1.1.16* | grep -E 'Package1|Package2|package3'
여기서 유일한 차이점은 첫 번째 grep을 사용하지 않았다는 것입니다. 이는 glob 패턴을 직접 전달할 수 있기 때문에 불필요합니다 ls
. 그런 다음 egrep
더 이상 사용되지 않는 것을 사용했는데 grep -E
똑같습니다.
그러나 이는 기본적으로 명령과 동일합니다. 그래도 작동하지 않으면 일치하는 파일이 없는 것입니다.
$ ls debs/
1.1.16.Package3 Package1.1.1.160 Package1.1.2.16 Package2.1.1.16
$ ls debs/*1.1.16* | grep -E 'Package1|Package2|package3'
debs/Package1.1.1.160
debs/Package2.1.1.16
예상대로 두 개의 일치하는 파일이 표시됩니다. 이것이 바로 명령이 인쇄하는 내용입니다.
$ ls debs/* | grep 1.1.16 | egrep -e 'Package1|Package2|package3'
debs/Package1.1.1.160
debs/Package2.1.1.16
스키마 package3
가 소문자( p
대신 P
) 이므로 grep
파일이 표시되지 않습니다.1.1.16.Package3
답변2
ls
출력을 자르지 않고 이를 수행하는 방법이 있습니다 .
version=1.1.16
for package in debs/*Package1*${version}* \
debs/*Package2*${version}* \
debs/*package3*${version}*;
do
action with $package;
done
그런 다음 쉘은 glob을 확장하고 일치하는 파일을 반복합니다. 제공된 패턴과 일치하는 파일이 없으면 스크립트는 오류 없이 루프를 건너뜁니다.
아니면 다음을 시도해 보세요 find
:
version=1.1.16
find debs/ \( -name "*Package1*${version}*" -o -name "*Package2*${version}*" -o -name "*package3*${version}*" \)