ls 및 grep을 사용하여 특정 확장자를 가진 파일 나열


153

방금 현재 디렉토리에서 파일을 가져오고 .mp4 .mp3 .exe 파일 만 출력합니다. 그래서 나는 이것을 할 수 있다고 생각했습니다.

ls | grep \.mp4$ | grep \.mp3$ | grep \.exe$

그러나 아니요, 첫 번째 grep은 mp4를 출력하기 때문에 다른 2 grep은 사용되지 않습니다.

어떤 아이디어? 추신 : Slow Leopard에서이 스크립트 실행


1
grep을 사용하는 대신 사용 shopt -s nullglob하고 참조하면 *.exe *.mp3 *.mp4됩니다. 참조 mywiki.wooledge.org/ParsingLs
찰스 더피

1
"Slow Leopard"가 오타인지 아닌지 알 수 없습니다 ...
Wowfunhappy

1
@Wowfunhappy hahaha는 분명히 오타였습니다. Snow Leopard가 매우 빠르다고 생각합니다.
민트

답변:


336

왜 안되 겠어요 :

ls *.{mp3,exe,mp4}

어디서 배웠는지 모르겠지만 이것을 사용하고 있습니다.


1
내가 사용하는 확장자가 디렉토리 용이므로 ls가 디렉토리의 내용을 나열하기 때문에 이것은 작동하지 않습니다.
Richard Venable

1
@RichardVenable은 -d 스위치를 추가하여 디렉토리가 재귀되지 않도록합니다.
Carlos Eugenio Thompson Pinzón

11
이 솔루션이 마음에 들지만 파일 형식 중 하나가 없으면 실패하는 것 같습니다. 예를 들어 mp3는 있지만 .exe는 없습니다 (Mac OSX, zsh)
JHo

2
나는 리디렉션 된 표준 에러로는 / dev / null을 피하기 위해 ls: *.exe: No such file or directory예 :ls *.{zip,tar.gz,tar} 2>/dev/null
이삭

1
ls foo *. {tar.gz, zip}을 쉘에서 직접 실행하면 작동하지만 쉘 스크립트 안에 넣을 때 latest = $ (ls -I ' .done'-tr $ {pkgprefix} . {tar. gz, zip} | tail -1) 오류 메시지가 나타납니다. ls : 'bamtools *. {tar.gz, zip}'에 액세스 할 수 없습니다 : 그러한 파일이나 디렉토리가 없으므로 더 똑똑한 사람이 답을 세분화 할 수 있습니다.
Kemin Zhou

41

다음과 함께 정규식을 사용하십시오 find.

find . -iregex '.*\.\(mp3\|mp4\|exe\)' -printf '%f\n'

파일 이름을 파이핑하는 경우 :

find . -iregex '.*\.\(mp3\|mp4\|exe\)' -printf '%f\0' | xargs -0 dosomething

공백이나 줄 바꿈이 포함 된 파일 이름을 보호합니다.

OS X find-E(향상된) 옵션이 사용될 때 교대 만 지원합니다 .

find -E . -regex '.*\.(mp3|mp4|exe)'

2
Mac OS X :find . -iregex '.*\(mp3\|mp4\|exe\)'
andilabs

3
andi, 그것은 맥 OS에서 저에게 효과가 없었습니다. 그러나 이것은 발견했습니다 : find -E. -regex '. * (mp3 | mp4 | exe)'
Joseph Johnson

이 솔루션은 다음과 같은 파일을로드합니다 : 정규 표현식의 끝에 및 확장자 앞에를 mysupermp3.jpg추가하는 것을 고려 하십시오$\\.
Panthro

1
@Panthro : 실제로는 그렇지 않습니다. 찾기는 암시 적 앵커를 사용하는 것으로 보입니다. 점은 좋은 생각입니다 (백 슬래시 하나만 필요).
추후 공지가있을 때까지 일시 중지되었습니다.

39

egrep -확장 된 grep-여기서 도움이 될 것입니다

ls | egrep '\.mp4$|\.mp3$|\.exe$'

일을해야합니다.


그게 다야! 고맙습니다. 대소 문자를 구분하지 않아야한다는 것을 깨달았습니다. ls | egrep -i '\ .mp4 $ | \ .mp3 $ | \ .exe $ 다른 사람이 그날 도움이 필요하면. 나는 항상 여기에 내 대답을 얻는 속도에 놀랐습니다.
Mint

이것이 어떻게 작동하는지 알 수 없습니다. 옵션이없는 ls는 열로 출력합니다. 줄 끝까지 정박하면 제대로 일치하지 않습니다.
camh

4
@camh : ls터미널에 (또는 -C옵션으로) 다중 열 출력을 생성합니다. ls파이프 (또는로 -1)에는 단일 열 출력이 있습니다. (비교 출력 ls과을 ls | cat).
mob

끝에 아포스트로피가 없습니다. 그 외에는 효과가있는 것 같습니다.
Björn

12

가장 쉬운 방법은 ls를 사용하는 것입니다.

ls *.mp4 *.mp3 *.exe

2
고맙지 만 이미 시도했지만 파일이 없을 때 발생하는 오류는 마음에 들지 않았습니다. 당신은 내가 그렇게함으로써 그것을 고칠 수 있었다 : ls * .mp4 * .mp3 * .exe 2> / dev / null 지금 그 생각 만 : P
Mint

1
나는 ls어떤 종류의 자동 옵션이 ​​없다는 것에 놀랐습니다 .
MitMaro

2
bash에서 "set -o nullglob"을 수행하면 오류가 발생하지 않습니다.
camh

2
내 실수 -해야한다 "shopt 내부 -s nullglob"하지 세트 -o 명령
camh

1
또는 그냥 "에코"를 사용 : *이 .MP4 * .MP3 * .EXE 에코
애드리안 Pronk

9

경우에 따라 : 왜 사용하지 find않습니까?

find -iname '*.mp3' -o -iname '*.exe' -o -iname '*.mp4'

나는 이것이 find . -name '*.mkv' -o -name '*.flv'(-o 절을 필요한만큼 추가하여) 대신 작동한다는 것을 알았습니다 . 나는이 필요 .디렉토리와 깃발을 표시하기 위해 -name하지 -iname- 나는 맥 OS 10.13에있어.
Chris

6

grep 필요가 없습니다. 쉘 와일드 카드가 트릭을 수행합니다.

ls *.mp4 *.mp3 *.exe

당신이 실행 한 경우

shopt -s nullglob

일치하지 않는 글롭은 모두 제거되며 확장되지 않은 명령 행에 남아 있지 않습니다.

대소 문자를 구분하지 않는 글 로빙을 원하면 * .mp3는 foo.MP3와 일치합니다.

shopt -s nocaseglob

내가 좋은 시간 부족에 준 것과 같은 의견.
Mint

1
-R하위 디렉토리에 일치하는 파일을 나열하는 옵션 과 함께 이것을 사용하려고 시도 하지만 옵션이 효과가없는 것 같으며 여전히 현재 디렉토리의 결과 만 얻습니다.
Chris

3

여전히 대체 솔루션을 찾고있는 경우 :

ls | grep -i -e '\\.tcl$' -e '\\.exe$' -e '\\.mp4$'

필요한 경우 더 많은 -e 플래그를 추가하십시오.


3

OSX 사용자의 경우 :

당신이 사용하는 경우 ls *.{mp3,exe,mp4}, 그것은 오류가 발생합니다 그 확장 기능 중 하나가 아무런 결과가없는 경우.

를 사용 ls *.(mp3|exe|mp4)하면 확장자 중 하나에 0 개의 결과가 있더라도 해당 확장자와 일치하는 모든 파일이 반환 됩니다 .


5
예제를 사용하여 구문 오류가 발생 했습니까 ??? 'bash : 예기치 않은 토큰 근처 구문 오류`('
nagordon

2
당신이 의미하는 것 같아요 ls *.@(mp3|exe|mp4). shopt -s extglob이 작업이 필요 합니다. 그건 그렇고, ls쓸모없는 것입니다, 당신은 할 수 있습니다 printf '%s\n' *.@(mp3|exe|mp4).
gniourf_gniourf

1
macOS 10.13에 구문 예기치 않은 토큰 메시지가 표시됨
Chris

1
ls | grep "\.mp4$
\.mp3$
\.exe$"

고맙지 만 여러 줄을 사용하는 것이 약간 불편합니다.
Mint

이 + mdfind는 최고의 / 빠른 검색을 제공합니다! mdfind -name querystring | grep "\.h$" 파일 제목에 quesrystring이있는 모든 헤더를 찾습니다. 조속히.
Alex Gray

1

ls -R | findstr ".mp3"

ls -R => 하위 디렉토리를 재귀 적으로 나열


-1

나를 위해 일한 한 가지 예가 있습니다.

find <mainfolder path> -name '*myfiles.java' | xargs -n 1 basename
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.