Как grep для расширения файла

в настоящее время я пытаюсь сделать скрипт, который бы вводил grep, чтобы увидеть, имеет ли что-то определенный тип файла (например, zip), хотя текст перед типом файла может быть чем угодно, так, например

something.zip
this.zip
that.zip

все подпадают под категорию. Я пытаюсь grep для них, используя подстановочный знак, и до сих пор я пробовал это

grep ".*.zip"

но когда я это сделаю, он найдет .zip файлы просто отлично, но он все равно будет выводить изображение, если есть дополнительные символы после .zip например .zippppppp или .zipdsjdskjc все равно будет подобран grep. Сказав это, что я должен сделать, чтобы предотвратить grep от отображения совпадений, которые имеют дополнительные символы после .zip?

9 ответов


тест для конца строки с $ и избежать вторую . С обратной косой чертой, поэтому он соответствует только периоду, а не любому символу.

grep ".*\.zip$"
ls *.zip - это более естественный способ сделать это, если вы хотите получить список всех .zip файлы в текущем каталоге или find . -name "*.zip" для всех .zip файлы в подкаталогах, начиная с (и в том числе) текущий каталог.

в UNIX попробуйте:

find . -name \*.zip -print

вам нужно сделать несколько вещей. Это должно выглядеть так:

grep '.*\.zip$'

вам нужно избежать второй точки, поэтому она будет просто соответствовать точке, а не любому символу. Использование одинарных кавычек делает escaping немного проще.

вам нужен знак доллара в конце строки, чтобы указать, что вы хотите, чтобы "zip" произошел в конце строки.


попробуй: grep -o -E "(\.([A-z])+)+"

я использовал это, чтобы получить многоточечные/несколько расширений. Итак, если вход был hello.tar.gz, тогда он выведет .tar.gz. Для одиночного пунктирного используйте grep -o -E "\.([A-z])+$". Проверено на С Cygwin/MinGW в+префикса msys.


Я использую это, чтобы получить список типов файлов внутри папки.

find . -type f | egrep -i -E -o "\.{1}\w*$" | sort -su

мероприятия к примеру:

.DS_Store
.MP3
.aif
.aiff
.asd
.doc
.flac
.jpg
.m4a
.m4p
.m4r
.mp3
.pdf
.png
.txt
.wav
.wma
.zip

бонус: с

find . -type f | egrep -i -E -o "\.{1}\w*$" | sort | uniq -c

вы получите количество файлов:

    106 .DS_Store
     35 .MP3
     89 .aif
      5 .aiff
    525 .asd
      1 .doc
     60 .flac
     48 .jpg
    149 .m4a
     11 .m4p
      1 .m4r
  12844 .mp3
      1 .pdf
      5 .png
      9 .txt
    108 .wav
     44 .wma
      2 .zip

еще одно исправление / аддон приведенного выше примера:

# multi-dotted/multiple extensions
grep -oEi "(\.([A-z0-9])+)+" file.txt

# single dotted
grep -oEi "\.([A-z0-9])+$" file.txt

Это позволит получить файл расширения '.МР3 и т. д.


вы также можете использовать grep, чтобы найти все файлы с определенным расширением:

find .|grep -e "\.gz$"

на . означает текущую папку. Если вы хотите указать папку, отличную от текущей папки, просто замените . путь к папке. Вот пример: Давайте найдем все файлы, которые заканчиваются на .gz и находятся в папке/var / log

  find /var/log/ |grep -e "\.gz$"

вывод примерно такой:

 ✘ ⚙> find /var/log/ |grep -e "\.gz$"

/var/log//mail.log.1.gz
/var/log//mail.log.0.gz
/var/log//system.log.3.gz
/var/log//system.log.7.gz
/var/log//system.log.6.gz
/var/log//system.log.2.gz
/var/log//system.log.5.gz
/var/log//system.log.1.gz
/var/log//system.log.0.gz
/var/log//system.log.4.gz

на $ подписать в основном статистику, что расширение файла заканчивается на gz


просто :

grep ".*.zip$"

" $ " указывает на конец строки


просто обзор некоторых других ответов. The .* Не обязательно, и если вы ищете определенное расширение файла, лучше всего включить-i, чтобы он был нечувствителен к регистру; в случае, если файл HELLO.ЗИП, например. Я также не думаю, что цитаты необходимы.

grep -i \.zip$