Как 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
файлы в подкаталогах, начиная с (и в том числе) текущий каталог.вам нужно сделать несколько вещей. Это должно выглядеть так:
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
просто обзор некоторых других ответов. The .*
Не обязательно, и если вы ищете определенное расширение файла, лучше всего включить-i, чтобы он был нечувствителен к регистру; в случае, если файл HELLO.ЗИП, например. Я также не думаю, что цитаты необходимы.
grep -i \.zip$