Как указать тип файлов в рекурсивных каталогах в оболочке?
Как мы можем найти файлы определенного типа, то есть файлы doc pdf, представленные во вложенных каталогах.
Я попытался:
$ ls -R | grep .doc
но если есть имя файла, подобное alok.doc.txt
, команда отобразит это тоже, что явно не то, что я хочу. Какую команду следует использовать вместо этого?
Ответы
Ответ 1
Если вы более комфортно с "ls" и "grep", вы можете делать то, что хотите, используя регулярное выражение в команде grep (символ "$" заканчивается, что .doc должен быть в конце строки Это исключает файл file.doc.txt):
ls -R |grep "\.doc$"
Дополнительная информация об использовании grep с регулярными выражениями в man.
Ответ 2
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
Некоторые из других методов, которые можно использовать:
echo *.{pdf,docx,jpeg}
stat -c %n * | grep 'pdf\|docx\|jpeg'
Ответ 4
Аналогично, если вы предпочитаете использовать подстановочный знак *
(не совсем похожий на предложения регулярного выражения), вы можете просто использовать ls
с флагом -l
для отображения одного файла на строку (например, grep) и -R
как у вас. Затем вы можете указать файлы, которые хотите найти, с помощью *.doc
И.Е. Либо
ls -l -R *.doc
или если вы хотите, чтобы он отображал файлы на меньшем количестве строк.
ls -R *.doc