시작 및 종료 패턴이 있는 파일 나열

시작 및 종료 패턴이 있는 파일 나열

"abc"로 시작하고 ".zip"으로 끝나는 디렉토리의 모든 파일을 나열하고 싶습니다.

을 사용하려고합니다 ls.

이 디렉토리에는 abc<date>및 로 시작하는 많은 zip 파일이 있습니다 xvz<date>. 나는 단지 다음 목록을 얻고 싶습니다abc<date>.zip

답변1

ls파일 이름에는 패턴 일치가 수행되지 않습니다. 단순히 인수로 제공된 디렉터리와 파일의 내용을 나열합니다.

반면에 쉘에는 다음과 같은 쉘이 있습니다.와일드카드또는파일 이름 생성또는경로명 확장패턴과 일치하는 파일 목록으로 패턴을 확장합니다.

여기서 glob 패턴은 abc*.zip( *와일드카드 문자로 다음을 나타 냅니다.임의 개수의 문자).

printf인쇄 와 같이 원하는 명령에 이를 전달할 수 있습니다 .

printf '%s\n' abc*.zip

ls -l이를 전달하여 다음 파일의 속성을 표시할 수도 있습니다 .

ls -ld abc*.zip

-d( 이러한 파일 중 하나라도 해당 유형인 경우 이 파일 이 필요합니다.목차, ls그렇지 않으면 해당 내용이 나열됩니다).

또는 한 번에 여러 파일만 추출할 수 있는 경우 unzip해당 파일을 추출하세요. unzip불행히도 그렇지 않으므로 다음을 사용 xargs -n1하거나 for반복해야 합니다.

printf '%s\0' abc*.zip | xargs -r0n1 unzip

또는:

for file in abc*.zip; do unzip "$file"; done

그러나 실제로는 unzipMS-DOS 명령의 포트에 더 가깝습니다. MS-DOS 명령 unzip자체는 인수를 glob으로 처리합니다. 즉, 명명된 파일 (Microsoft 운영 체제의 파일 이름이 아닌 Unix의 완전히 유효한 파일 이름)은 unzip 'abc*.zip'압축 해제되지 않지만 패턴과 일치하는 파일이므로 실제로 원하는 것은 다음과 같습니다.abc*.zipabc*.zip

 unzip 'abc*.zip'

(실제로 위의 xargs접근 방식 은 잘못된 것입니다 . 예를 들어 for호출된 파일이 있으면 패턴으로 처리되기 때문입니다! 아카이브를 추출하는 보다 유니크한 방법은 참조하세요 .)abc*.zipunzipbsdtarzip


대소문자를 구분하지 않는 일치를 위해 ² Portable을 사용할 수 있습니다 [aA][bB][cC]*.[zZ][iI][pP]. 일부 쉘에는 대소문자를 구분하지 않는 일치를 위해 확장된 와일드카드가 있습니다.

  • zsh:

    setopt extendedglob
    ls -ld (#i)abc*.zip
    

    또는:

    ls -ld ((#i)abc)*.zip
    

    abc해당 부분이 대소 문자를 구분하지 않기를 원하는 경우 .

  • ksh93:

    ls -ld ~(i)abc*.zip
    

    또는:

    ls -ld ~(i:abc)*.zip
    
  • 그리고 bash.

    shopt -s nocaseglob
    ls -ld abc*.zip
    

    (이식 가능한 구문을 사용하는 것 외에는 glob의 일부만 대소문자를 구분하도록 만들 수 있는 방법이 없습니다.)

  • 그리고 yash:

    set +o case-glob
    ls -ld abc*.zip
    

    위와 같은 bash댓글 입니다.


-I PATTERN¹ // --ignore=PATTERNGNU --hide=PATTERN에 의해 구현된 비표준 확장을 고려하고 싶지 않은 경우 ls.

² 그러나 포함된 여러 셸에서 bash패턴이 어떤 파일과도 일치하지 않으면 그대로 명령에 전달되고 [aA][bB][cC]*.[zZ][iI][pP]문자 그대로 이름이 지정된 파일이 추출됩니다. Bash에서 이 옵션을 설정하면 failglob이 문제를 피할 수 있습니다.

답변2

ls abc*.zip

그러나 파일이 너무 많으면 실패합니다(셸 확장에는 확장할 수 있는 인수 수에 제한이 있습니다).

find . -name "abc*.zip"

이것은 아마도 가장 일반적 일 것입니다. 따옴표가 있어야합니다. 일부 구현에서는 대소문자를 구분하지 않는 검색( 이 역시 일치함) 을 대신 find사용할 수도 있습니다 .-iname-nameaBc<date>.ZIP

ls | grep -x "abc.*\.zip"

.*필터 grep은 정규식을 사용 하므로 쉘에서 확장을 위해 사용 \.하는 와일드카드 표기법과 다릅니다. grep -i대소문자를 구분하지 않는 검색 에 사용됩니다 .

답변3

ls의 출력을 으로 파이프할 수 있습니다 grep.

abc파일 이름에 다음이 포함된 모든 파일을 찾고 싶다고 가정해 보겠습니다.

ls -f | grep abc

특정 패턴 변형이 필요한 경우,man grep

답변4

ls예시에서 검색할 디렉터리를 지정해야 합니다.

ls -la ~/file*.* 
ls -la ./file*.*

그것은 나를 위해 일했지만 분명히 패턴으로 검색을 지원하지 않습니다

관련 정보