대소 문자를 구분하지 않는 패턴을 LS와 일치시키는 방법은 무엇입니까?


57

사례를 무시하면서 특정 패턴과 일치하는 모든 파일을 나열하고 싶습니다.

예를 들어 다음 명령을 실행합니다.

ls *abc*

다음과 같이 대소 문자를 무시하고 파일 이름의 일부로 "abc"가있는 모든 파일을보고 싶습니다.

-rw-r--r-- 1 mtk mtk 0 Sep 21 08:12 file1abc.txt
-rw-r--r-- 1 mtk mtk 0 Sep 21 08:12 file2ABC.txt

노트

맨 페이지에서 사례를 검색했지만 아무것도 찾을 수 없습니다.

답변:


65

이것은 실제로 셸이 아닌 셸에서 수행합니다 ls.

에서 bash다음을 사용합니다.

shopt -s nocaseglob

그리고 다음 명령을 실행합니다.

또는 zsh:

unsetopt CASE_GLOB

또는 야쉬에서 :

set +o case-glob

그리고 당신의 명령.

이를 각각 .bashrc, .zshrc또는 에 넣을 수 있습니다 .yashrc.

또는 zsh를 사용하여 :

setopt extendedglob
ls -d -- (#i)*abc*

(즉, 와일드 카드별로 대소 문자를 구분하지 않는 대소 문자 구분)

ksh93으로 :

ls -d -- ~(i:*abc*)

모든 파일 이 쉘 에 의해 전달되므로 globbing 이 아닌 다른 방식으로 작동하기를 원합니다 .lsls


bash에서 사용하면 원래 설정으로 재설정하는 방법은 shport -s nocaseglob무엇입니까?
mtk

6
@mtk : 옵션 을 설정 하려면 shopt -s; 설정해제 하려면을 사용 shopt -u합니다. 또는 ( )설정이 부모 셸에 영향을 미치지 않도록 사용 하여 하위 셸의 모든 내용을 래핑 할 수 있습니다 (shopt -s nocaseglob ; ls *abc*).
ruakh

POSIX 또는 SUS 또는 이와 비슷한 (이를 제외하고 [aA][bB][cC]) 이식 가능한 방법이 없습니까?
Timothy Gu

훌륭한 솔루션, 나는 shopt지난 15 년 동안 bash를 사용하여 명령을 보지 못했다고 믿을 수 없다 !
Reza Sanaie

Jfg956의 대답은 맞습니다 (다음 것). 정규 표현식이있을 때 왜 쉘 동작을 변경합니까?
EnzoR

20

polemon이 설명했듯이 *abc*파일 목록으로 확장되는 쉘은 ls가 아닙니다 . 이것을 패턴 일치 라고 합니다.

대소 문자를 무시하도록 전체 패턴 일치 동작을 변경하는 것 외에도. 이외의 다른 패턴 일치를 사용할 수 있습니다 *. 다음은 bash에서 원하는 것을 수행합니다.

ls *[aA][bB][cC]*

bash man에서 :

[...] 동봉 된 문자 중 하나와 일치합니다.

이것은 당신이 사용할 수있는 더 미세한 입자 일치 수 *[aA][bB]c*에 맞게 abc또는 ABc아닌 abC이상 ABC. 또는 e캐릭터의 모든 인스턴스와 일치시킬 수있는 프랑스어의 예 :

ls *[eéèêëEÉÈÊË]*

1
불행히도 패턴이 길어질수록 그 접근 방식은 빠르게 다루기 어려워집니다. 그러나 짧은 일에는 효과가 있습니다.
derobert

@derobert : 완전히 사실입니다. 특히 쉘은 비교하기 전에 모든 파일 이름과 일치 요청을 소문자로 넣어서 무시 무시 사례를 최적화했습니다. 그러나 [...]많은 경우에 유용 할 수 있으며 언급 할 가치가 있습니다.
jfg956

1
이것이 정답입니다. 쉘 동작을 변경하는 것은 아닙니다.
EnzoR

로케일이 올바르게 설정되면 등가 클래스를 사용할 수 있어야합니다 [[=e=][=E=]].
Benjamin W.

8

-i(--ignore-case) 옵션을 추가 grep하여 아래 출력을 얻을 수도 있습니다 .

[root@localhost ~]# ls -l | grep -i abc
-rw-r--r--  1 root root    0 Feb 25 20:41 fileabc.txt
-rw-r--r--  1 root root    0 Feb 25 20:41 fileABC.txt

grep은 모든 것을 수집 한 다음 필터링해야하므로 grep과 비교하여 패턴 일치가 더 좋습니다. 큰 폴더로 작업 할 때 눈에 띄는 차이가 있습니다.
Omi

@Omi 또한 정규 표현식은 text , 특히 텍스트 줄에 대한 것입니다. 파일 이름에는 줄 바꿈이 포함될 수 있습니다.
Kusalananda

3

나는 이것이 ls로 가능하다고 생각하지 않지만 대신 find를 사용할 수 있습니다.

find . -maxdepth 1 -iname '*abc*'

0

다음 코드를 사용하십시오.

LC_COLLATE=en_US ; export LC_COLLATE
ls *abc*
LC_COLLATE=C ; export LC_COLLATE

LC_COLLATE 변수는 무엇입니까? 더 설명해 주시겠습니까?
mtk

링크 를 클릭하면 이 @mtk에 대해 알 수 있습니다
user1678213

0

-i무감각 옵션을 추가하여 파일을 그 리핑 할 수 있습니다 .

예를 들어 모두를 찾을 수 abcABC이 명령을 실행할 수 있습니다

    [root@mtk bin]# ls -l | grep -i abc
    640K -rw-r--r-- 1 mtk mtk 639K Sep 21 08:12 file1abc.txt
    676K -rw-r--r-- 1 mtk mtk 674K Sep 21 08:12 file2ABC.txt

5
Luis Perez 나는 당신이 -i명령 어디에서나 옵션을 사용하지 않았다고 생각합니다 .
Mongrel


-2

tcsh에서 .aliases에 별명을 설정하십시오.

alias lsnc "ls BS!* | sort -f "

( "BS"= 하나의 "백 슬래시"; 브라우저에 표시하려면 이것을 사용해야했습니다.)

lsnc대신에 사용하십시오ls

bash에서 .bash_aliases의 별칭을 다음과 같이 시도하십시오.

lsnc() { ls $1 | sort -f ; }

ls예를 들어, 옵션을 사용하면 ls -l간단한 수정 사항이 있습니다.

tcsh :

alias lsncl "ls -l BS!* | sort -f -k 9"

세게 때리다:

lsncl() { ls -l $1 | sort -f -k 9 ; }

=lsnocase 다음에 ' '가 누락되지 않았습니까?
Anthon

Anthon : Cygwin과 Ubuntu에서 tcsh와 bash에서 (수정 된) lsnc와 lsncl이 작동합니다. bash의 경우 "별칭"자체가 아닌 함수를 사용하고 있습니다. Lester
Lester Ingber

Anthon : 그렇습니다. 별칭 lsncl = 'ls -l $ 1 | sort -f -k 9 '
Lester Ingber

이 답변은 대소 문자를 구분하지 않고 ls로 전달 된 파일을 전달하려는 특정 질문을 다루지 않습니다. 쉘이 통과 통과하면 너무 적은 수의 파일을 ls, 거기에 아무것도 ls하고 sort할 수있는 상황을 해결 할 수 있습니다. 다른 답변에서 언급했듯이 문제는 ls구문이 아닌 셸에서 해결해야 합니다.
Mark Stosberg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.