Список файлів із певними розширеннями з ls та grep


153

Я просто хочу отримати файли з поточного режиму і тільки вихід .mp4 .mp3 .exe файли нічого іншого. Тож я подумав, що можу просто так:

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

Але ні, оскільки перший grep виведе просто mp4, для цього інші 2 grep не будуть використані.

Будь-які ідеї? PS, Запуск цього сценарію на Slow Leopard.


1
Це дійсно неправильний підхід - замість того, щоб використовувати grep, використовуйте, shopt -s nullglobа потім просто звертайтеся до цього *.exe *.mp3 *.mp4. Дивіться mywiki.wooledge.org/ParsingLs
Чарльз Даффі

1
Я не можу зрозуміти, чи був "Повільний леопард"
друком

1
@Wowfunhappy hahaha, безумовно, був помилковим помилкою, я пам'ятаю, що Сніжний Леопард був досить швидким.
Монетний двір

Відповіді:


336

Чому ні:

ls *.{mp3,exe,mp4}

Я не впевнений, де я це навчився - але я цим користувався.


1
Це не працює для мене, оскільки розширення, яке я використовую, призначене для каталогу, тому ls перераховує вміст каталогу.
Річард Венебл

1
@RichardVenable додайте перемикач -d, щоб запобігти повторенню каталогів.
Карлос Еухеніо Томпсон Пінсон

11
Мені подобається це рішення, але воно, здається, не вдається, якщо вам не вистачає жодного з файлів. Наприклад, у вас є mp3, але немає .exe (Mac OSX, zsh)
JHo

2
Я переадресував stderr на / dev / null, щоб уникнути, ls: *.exe: No such file or directoryнаприклад:ls *.{zip,tar.gz,tar} 2>/dev/null
Ісаак

1
Коли я запускаю ls foo *. {Tar.gz, zip} безпосередньо в оболонці, він працює, але коли вводимо це все до останнього сценарію оболонки = $ (ls -I ' .done' -tr $ {pkgprefix} . { Tar . gz, zip} | хвост -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
Анді, це не працювало для мене на Mac OS. Але це зробило: знайди -Е. -regex '. * (mp3 | mp4 | exe)'
Джозеф Джонсон

Це рішення буде завантажувати файли на кшталт: mysupermp3.jpgрозглянути питання про додавання $в кінці регулярного вираження та \\.до розширень
Panthro

1
@Panthro: насправді, не буде. Здається, у Find знайдуть використання якорних якорів. Крапка - це гарна ідея (потрібен лише один зворотний проріз).
Призупинено до подальшого повідомлення.

39

egrep - продовжений греп - допоможе тут

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

повинен виконати роботу.


Це воно! Дякую Щойно зрозумів, що я повинен бути нечутливим до справи, тому я використовую: ls | egrep -i '\ .mp4 $ | \ .mp3 $ | \ .exe $ Якщо ви хочете, щоб хтось інший потребував допомоги в цьому один день. Мене завжди дивує швидкість, яку я отримую тут свою відповідь.
Монетний двір

Я не бачу, як це буде працювати. ls без жодних опцій дає результат у стовпцях. Прив’язка до кінця рядка не буде відповідати належним чином.
camh

4
@camh: lsдо терміналу (або з -Cопцією) виробляється багатоколонний вихід. lsдо труби (або з -1) має вихід одного стовпця. (Порівняйте вихід lsз ls | cat).
моб

В кінці є апостроф. Крім того, що, здається, працює.
Бьорн

12

найпростіший спосіб - просто використовувати ls

ls *.mp4 *.mp3 *.exe

2
Дякую, але я вже пробував це, і мені не сподобалися помилки, які ви отримуєте, коли файлу немає. Ти міг би це виправити, зробивши: ls * .mp4 * .mp3 * .exe 2> / dev / null Тільки про це тепер подумав ти: P
Монетний двір

1
Я здивований, що lsне існує якихось тихих варіантів.
MitMaro

2
У bash, ви можете зробити "set -o nullglob", і ви не отримаєте помилок.
camh

2
Моя помилка - це має бути "shopt -s nullglob", а не команда set -o
camh

1
Або просто скористайтеся "echo": echo * .mp4 * .mp3 * .exe
Адріан Пронк,

9

Про всяк випадок: чому б вам не скористатися find?

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

Я встановив, що це працює натомість - find . -name '*.mkv' -o -name '*.flv'(додаючи стільки -о застережень, скільки потрібно). Я необхідна , .щоб вказати каталог і прапор -nameНЕ -iname- я на MacOS 10.13.
Кріс

6

Немає потреби в грепі. Shell wildcards зробить трюк.

ls *.mp4 *.mp3 *.exe

Якщо ви бігли

shopt -s nullglob

тоді незрівняні глобуси будуть видалені зовсім і не залишатимуться в командному рядку нерозкритим.

Якщо ви хочете нечутливий до регістру глобул (так * .mp3 буде відповідати foo.MP3):

shopt -s nocaseglob

Той самий коментар, що я дав племені Good Time.
Монетний двір

1
Я намагаюся використовувати це з -Rможливістю перелічити відповідні файли у підкаталогах, але ця опція, мабуть, не має ніякого ефекту, і я все ще отримую лише результати поточного каталогу.
Кріс

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$"

Дякую, але трохи незручно, використовуючи кілька рядків.
Монетний двір

Це + mdfindдає найкращі / найшвидші пошуки ВСЕ! mdfind -name querystring | grep "\.h$" знаходить усі заголовки із запитаннями у назві файлу. pronto.
Алекс Грей


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.