it-swarm.com.ru

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

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

команда, которую я попробовал:

$ ls -R | grep .doc

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

35
Kumar Alok

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

ls -R |grep "\.doc$"

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

57
Benoit Courtine

Вывод команды 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
30
ghostdog74

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

echo *.{pdf,docx,jpeg}

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

3
Sergiy Kolodyazhnyy

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

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

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

/etc/conf/server.conf

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

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

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

/etc/conf/server.conf: ServerName "default-118_11_170_172"

Надеюсь, что вы найдете ее полезной.

Sid

2
dead parrot software
find . | grep "\.doc$"

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

1
Leo Bastin

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

ls -l -R *.doc

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

ls -R *.doc
0
Will C