Ls ve grep ile belirli uzantılara sahip dosyaları listele


153

Sadece geçerli dir gelen dosyaları almak istiyorum ve sadece çıkış .mp4 .mp3 .exe dosyaları başka bir şey. Bunu yapabileceğimi düşündüm:

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

Ama hayır, ilk grep sadece mp4'leri çıkardığı için diğer 2 grep'ler kullanılmayacak.

Herhangi bir fikir? PS, Bu senaryoyu Slow Leopard'da çalıştırıyorum.


1
Bu gerçekten yanlış bir yaklaşımdır - grep kullanmak yerine kullanın shopt -s nullglobve sadece bakın *.exe *.mp3 *.mp4. Bkz. Mywiki.wooledge.org/ParsingLs
Charles Duffy

1
"Yavaş Leopard" ın bir yazım hatası olup olmadığını
anlayamıyorum

1
@Wowfunhappy hahaha, kesinlikle bir yazım hatasıydı, Snow Leopard'ın oldukça hızlı olduğunu düşündüm.
Nane

Yanıtlar:


336

Neden olmasın:

ls *.{mp3,exe,mp4}

Nereden öğrendiğimden emin değilim - ama bunu kullanıyorum.


1
Kullandığım uzantı bir dizin için olduğundan bu benim için çalışmıyor, bu yüzden ls dizinin içeriğini listeliyor.
Richard Venable

1
@RichardVenable dizinlerin yinelenmesini önlemek için -d anahtarını ekleyin.
Carlos Eugenio Thompson Pinzón

11
Bu çözümü seviyorum, ancak dosya türlerinden herhangi birini kaçırırsanız başarısız görünüyor. Örneğin,
mp3'ünüz

2
Stderr'ı önlemek için / dev / null öğesine yönlendirdim, ls: *.exe: No such file or directoryörneğin:ls *.{zip,tar.gz,tar} 2>/dev/null
Isaac

1
Ls foo *. {Tar.gz, zip} 'i doğrudan bir kabukta çalıştırdığımda çalışır, ancak bunu bir kabuk betiğinin içine koyduğumda en son = $ (ls -I' .done '-tr $ {pkgprefix} . {Tar. gz, zip} | tail -1) Bir hata mesajı aldım: ls: 'bamtools *. {tar.gz, zip}' 'e erişemiyorum: Böyle bir dosya veya dizin yok, daha akıllı bir adam cevabı geliştirebilir.
Kemin Zhou

41

Şununla düzenli ifadeler kullanın find:

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

Dosya adlarını veriyorsanız:

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

Bu, boşluk veya satırsonu içeren dosya adlarını korur.

OS X findyalnızca -E(gelişmiş) seçeneği kullanıldığında değişimi destekler .

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

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

3
andi, bu benim için Mac OS'de işe yaramadı. Ama bu yaptı: -E'yi bul. -regex '. * (mp3 | mp4 | exe)'
Joseph Johnson

Bu çözüm aşağıdaki gibi dosyaları yükleyecektir: normal ifadenin sonuna ve uzantılardan önce mysupermp3.jpgeklemeyi düşünün$\\.
Panthro

1
@Panthro: aslında olmayacak. Bul, örtülü çapaları kullanıyor gibi görünüyor. Nokta iyi bir fikirdir (sadece bir ters eğik çizgi gereklidir).
sonraki duyuruya kadar duraklatıldı.

39

egrep - genişletilmiş grep - burada yardımcı olacak

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

işi yapmalı.


Bu kadar! Teşekkürler Sadece farksız olması gerektiğini fark etti, bu yüzden kullanıyorum: ls | egrep -i '\ .mp4 $ | \ .mp3 $ | \ .exe $ Başkasının o gün yardıma ihtiyacı varsa. Cevabımı buraya aldığım hızdan hep şaşırdım.
Nane

Bunun nasıl çalışacağını göremiyorum. ls herhangi bir seçenek olmadan sütunlarda çıktı üretir. Hattın sonuna sabitleme düzgün şekilde eşleşmeyecektir.
camh

4
@camh: lsbir terminale (veya -Cisteğe bağlı olarak) çok sütunlu çıktı üretir. lsbir boruya (veya ile -1) tek sütun çıkışı vardır. (Çıkışını karşılaştır lsile ls | cat).
mob

Sonunda kayıp bir kesme işareti var. Bunun dışında işe yarıyor gibi görünüyor.
Björn

12

en kolay yol sadece ls kullanmaktır

ls *.mp4 *.mp3 *.exe

2
Teşekkürler, ama bunu zaten denedim ve dosya olmadığında aldığınız hataları beğenmedim. Bunu yaparak bunu düzeltebilirdim: ls * .mp4 * .mp3 * .exe 2> / dev / null Bunu şimdi düşündünüz: P
Mint

1
Bunun bir lsçeşit sessiz seçeneği olmadığına şaşırdım .
MitMaro

2
Bash, "set -o nullglob" yapabilirsiniz ve hataları almayacaksınız.
camh

2
Benim hatam - bu set -o komutu değil "shopt -s nullglob" olmalıdır
camh

1
Veya sadece "echo" kullanın: echo * .mp4 * .mp3 * .exe
Adrian Pronk

9

Her ihtimale karşı: neden kullanmıyorsun find?

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

Bunun yerine çalıştı buldum - find . -name '*.mkv' -o -name '*.flv'(gerektiği kadar çok -o cümleleri ekleyerek). Ben .dizin ve bayrak -namedeğil belirtmek için gerekli -iname- macOS 10.13.
Chris

6

Grep'e gerek yok. Shell joker karakter işinizi görecektir.

ls *.mp4 *.mp3 *.exe

Eğer koştuysan

shopt -s nullglob

eşleşmeyen globlar tamamen kaldırılır ve komut satırında genişletilmez.

Büyük / küçük harfe duyarlı olmayan globbing istiyorsanız (yani * .mp3 foo.MP3 ile eşleşir):

shopt -s nocaseglob

Good Time Tribe'a verdiğim yorumla aynı.
Nane

1
Bu -Ralt dizinlerde eşleşen dosyaları listeleme seçeneği ile kullanmaya çalışıyorum ama seçenek herhangi bir etkisi var gibi görünmüyor ve hala sadece geçerli dizinin sonuçlarını almak.
Chris

3

Hala alternatif bir çözüm arıyorsanız:

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

Gerekirse daha fazla bayrak eklemekten çekinmeyin.


3

OSX kullanıcıları için :

Eğer kullanırsanız ls *.{mp3,exe,mp4}, bu bir hata atar bu uzantıların biri hiçbir sonuç varsa.

Kullanıldığında , uzantılardan birinde 0 sonuç olsa bilels *.(mp3|exe|mp4) bu uzantılarla eşleşen tüm dosyalar döndürülür .


5
Örneğini kullanarak bir sözdizimi hatası aldım ??? 'bash: beklenmedik belirtecin yanında sözdizimi hatası `('
nagordon

2
Sanırım demek istiyorsun ls *.@(mp3|exe|mp4). Bunun shopt -s extglobçalışması için ihtiyacınız var . Bu arada, lsişe yaramaz, sadece yapabilirsin printf '%s\n' *.@(mp3|exe|mp4).
gniourf_gniourf

1
MacOS 10.13'te sözdizimi beklenmedik simge mesajı alıyorum
Chris

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

Teşekkürler, ancak birkaç satır kullanarak biraz rahatsız edici.
Nane

Bu + mdfindHİÇ en iyi / en hızlı aramaları sağlar! mdfind -name querystring | grep "\.h$" dosya başlığında quesrystring içeren tüm başlıkları bulur. pronto.
Alex Gray

1

ls -R | findstr ".mp3"

ls -R => alt dizinleri özyinelemeli olarak listeler


-1

İşte benim için çalışan bir örnek.

find <mainfolder path> -name '*myfiles.java' | xargs -n 1 basename
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.