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