Подтвердить что ты не робот

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

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

something.zip
this.zip
that.zip

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

grep ".*.zip"

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

4b9b3361

Ответ 1

Протестируйте конец строки с помощью $ и уберите второй . с обратным слэшем, чтобы он соответствовал периоду, а не любому символу.

grep ".*\.zip$"

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

Ответ 2

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

find . -name \*.zip -print

Ответ 3

Вам нужно сделать пару вещей. Он должен выглядеть следующим образом:

grep '.*\.zip$'

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

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

Ответ 4

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

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

Ответ 5

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

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

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

Это позволит получить расширения файлов, такие как ".mp3" и т.д.

Ответ 6

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

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

Ответ 7

Вы также можете использовать 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

Ответ 8

Просто выполните:

grep ".*.zip$"

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

Ответ 9

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

grep -i \.zip$