"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
그러나 실제로는 unzip
MS-DOS 명령의 포트에 더 가깝습니다. MS-DOS 명령 unzip
자체는 인수를 glob으로 처리합니다. 즉, 명명된 파일 (Microsoft 운영 체제의 파일 이름이 아닌 Unix의 완전히 유효한 파일 이름)은 unzip 'abc*.zip'
압축 해제되지 않지만 패턴과 일치하는 파일이므로 실제로 원하는 것은 다음과 같습니다.abc*.zip
abc*.zip
unzip 'abc*.zip'
(실제로 위의 xargs
접근 방식 은 잘못된 것입니다 . 예를 들어 for
호출된 파일이 있으면 패턴으로 처리되기 때문입니다! 아카이브를 추출하는 보다 유니크한 방법은 참조하세요 .)abc*.zip
unzip
bsdtar
zip
대소문자를 구분하지 않는 일치를 위해 ² 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=PATTERN
GNU --hide=PATTERN
에 의해 구현된 비표준 확장을 고려하고 싶지 않은 경우 ls
.
² 그러나 포함된 여러 셸에서 bash
패턴이 어떤 파일과도 일치하지 않으면 그대로 명령에 전달되고 [aA][bB][cC]*.[zZ][iI][pP]
문자 그대로 이름이 지정된 파일이 추출됩니다. Bash에서 이 옵션을 설정하면 failglob
이 문제를 피할 수 있습니다.
답변2
ls abc*.zip
그러나 파일이 너무 많으면 실패합니다(셸 확장에는 확장할 수 있는 인수 수에 제한이 있습니다).
find . -name "abc*.zip"
이것은 아마도 가장 일반적 일 것입니다. 따옴표가 있어야합니다. 일부 구현에서는 대소문자를 구분하지 않는 검색( 이 역시 일치함) 을 대신 find
사용할 수도 있습니다 .-iname
-name
aBc<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*.*
그것은 나를 위해 일했지만 분명히 패턴으로 검색을 지원하지 않습니다