특정 패턴과 일치하는 파일을 나열하고 다른 패턴과 일치하는 파일을 무시하시겠습니까?

특정 패턴과 일치하는 파일을 나열하고 다른 패턴과 일치하는 파일을 무시하시겠습니까?

a1, a2, a3, b1, b2, b3 파일을 포함하는 디렉토리가 있다고 가정합니다. 로 시작 a하지만 포함하지 않고 일치시키고 싶습니다 3. 시도했지만 일치하지 않았음에도 ls -I "*3" *a*반환되었습니다 . 가능합니까 ?a1 a2 a3a3ls

답변1

오직:

shopt -s extglob failglob
ls -d a!(*3*)
  • shopt -s extglob확장된 와일드카드를 활성화합니다(ksh 확장 연산자의 하위 집합을 활성화합니다).
  • failglob일치하는 항목이 없으면 전역 모드를 그대로 유지하는 대신 명령을 취소합니다. 이것이 a!(*3*)없으면 호출한 파일에 3.
  • a경기 시작a
  • !()()내의 일치를 부정합니다.
  • *3*이것 3과 그 전후에 오는 모든 것.

$ touch 1 2 3 a1 a2 a3 b1 b2 b3 aa1 aa2 aa3 a2a a3a
$ ls -d a!(*3*)
a1  a2  a2a  aa1  aa2

답변2

find기존 답변은 glob을 사용하여 이 작업을 수행하는 가장 좋은 방법을 잘 설명합니다. 대부분의 경우 스크립팅이나 추가 처리를 수행하려는 경우 더 나은 옵션이기 때문에 이를 포함하겠습니다 .

$ find . -maxdepth 1 -name 'a*' -not -name '*3*'
./a1
./a2

xargs간단한 작업에 응답을 제공 하거나 while read더 복잡한 작업을 처리하기 위해 루프에 응답을 제공할 수 있습니다.

답변3

간단한 방법은

  • 일치하는 모든 파일 나열a*
  • 그런 다음 다음을 포함하는 모든 줄을 삭제하십시오.3

유닉스 명령어는

ls -1 a* | grep -v 3

ls -1한 줄에 하나의 파일을 표시합니다.

grep일반적으로 패턴과 일치하는 줄을 찾지만 -v이 동작은 반대입니다. 즉, grep은 패턴과 일치하지 않는 줄을 찾습니다.

답변4

이전 답변에서 알 수 있듯이 다음과 같이 해결할 수 있습니다.엘에스. 나에게 이 특정 질문은 귀하의 솔루션이 작동하지 않은 이유를 어느 정도 암시합니다. 그래서 이에 뒤늦게 기여하고 싶습니다.
원래,

ls -I "*3" *a*

다음으로 끝나는 모든 항목을 제외해야 합니다., 또한 다음을 포함합니다.분명히모두 포함. 실제로,*ㅏ*쉘 와일드카드 사용 및 확장앞으로실제 명령이 실행됩니다."*삼"이 섹션에 인용된 대로). 따라서 귀하의 명령은 귀하의 경우와 동일합니다.

ls -I "*3" a1 a2 a3

그래서 항목이 나열됩니다a3. 따라서 목록에 분명히 주어진 항목은 다음과 관련된 거부된 항목입니다.-나. 거기에서 나는 결론을 내린다.암묵적으로수동적인 의미에서명시적으로 지정되지 않은 모든 것,예를 들어

ls -I "*3"

제외됩니다a3(그러나 이 디렉토리에서 고려되는 다른 항목도 표시됩니다.b1).

관련 정보