Как перечислить определенный тип файлов в рекурсивных каталогах в оболочке? - PullRequest
37 голосов
/ 20 августа 2010

Как мы можем найти определенный тип файлов, т. Е. PDF-файлы doc, присутствующие во вложенных каталогах.

команда, которую я пытался:

$ ls -R | grep .doc

но если есть имя файла, например alok.doc.txt, команда отобразит это тоже, что явно не то, что я хочу. Какую команду мне использовать вместо?

Ответы [ 6 ]

63 голосов
/ 20 августа 2010

Если вам удобнее использовать «ls» и «grep», вы можете делать то, что вы хотите, используя регулярное выражение в команде grep (завершающий символ «$» означает, что .doc должен находиться в конце строкиЭто исключит "file.doc.txt"):

ls -R |grep "\.doc$"

Дополнительная информация об использовании grep с регулярными выражениями в the man .

31 голосов
/ 20 августа 2010

ls вывод команды в основном предназначен для чтения человеком.Для расширенного запроса для автоматической обработки, вы должны использовать более мощную команду find:

find /path -type f \( -iname "*.doc" -o -iname "*.pdf" \) 

Как если бы у вас был bash 4.0 ++

#!/bin/bash
shopt -s globstar
shopt -s nullglob
for file in **/*.{pdf,doc}
do
  echo "$file"
done
3 голосов
/ 18 мая 2015

Некоторые другие методы, которые можно использовать:

echo *.{pdf,docx,jpeg}

stat -c %n * | grep 'pdf\|docx\|jpeg'

2 голосов
/ 13 сентября 2018

У нас был похожий вопрос.Мы хотели получить список - с путями - всех файлов конфигурации в каталоге etc.Это сработало:

find /etc -type f \( -iname "*.conf" \)

Это дает хороший список всех файлов .conf с их путем.Вывод выглядит так:

/etc/conf/server.conf

Но мы хотели сделать что-то со ВСЕМИ этими файлами, например, grep, чтобы найти слово или настройку во всех файлах.Поэтому мы используем

find /etc -type f \( -iname "*.conf" \) -print0 | xargs -0 grep -Hi "ServerName"

для поиска через grep ВСЕХ файлов конфигурации в / etc, которые содержат параметр типа «ServerName».

Сид

2 голосов
/ 30 января 2018
find . | grep "\.doc$"

Это также покажет путь.

0 голосов
/ 14 июля 2016

Точно так же, если вы предпочитаете использовать подстановочный знак * (не совсем как в предложениях регулярных выражений), вы можете просто использовать ls с обоими флагами -l, чтобы вывести один файл в строке (например, grep) и -R флаг, как у вас.Затем вы можете указать файлы, которые вы хотите искать, с помощью *.doc IE. Либо

ls -l -R *.doc

, либо, если вы хотите, чтобы файлы отображались в меньшем количестве строк.

ls -R *.doc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...