Рекурсивно знаходити файли з певним розширенням


81

Я намагаюся знайти файли з певними розширеннями. Наприклад, я хочу знайти всі файли .pdf та .jpg з ім'ям Роберт

Я знаю, що можу виконати цю команду

$ find . -name '*.h' -o -name '*.cpp'

але мені потрібно вказати назву самого файлу, крім розширень. Я просто хочу подивитися, чи є можливий спосіб уникнути написання імені файлу знову і знову Дякую!


4
Кожен, хто копіює цю команду або будь-яку нижче, повинен використовувати inameзамість неї - це не враховує регістр .
Аддісон

Хороший момент, Аддісон (звідси +1). Однак, схоже, що ОР хоче файли на ім'я "Роберт" з великою "Р". Як я трактую допис, це означає, що файли, що містять "robert", НЕ повинні виводитися. " R obert" - це те, що написано. Однак бувають ситуації, коли хтось хоче, щоб був знайдений або «Роберт», або «Роберт». Можливо, ОП у цій ситуації. Чи використовувати inameчи nameзалежить від того, що ви хочете знайти. Я потрапляв у ситуації, коли справа мала важливе значення.
bballdave025,

Відповіді:


101

Мої уподобання:

find . -name '*.jpg' -o -name '*.png' -print | grep Robert

2
Працює добре, але незначним недоліком є ​​те, що це заважає вам робити такеfind -exec ...
Mark Setchell

що, якщо я хочу знайти всі файли xxx-deployment.yml у всіх папках за певним шляхом?
Naim Salameh

Це працює не так добре, якщо у вас є jpgабо pngяк частина більш тривалого шляху.
AutonomousApps

18

Використовуючи аргумент find' -regex:

find . -regex '.*/Robert\.\(h\|cpp\)$'

Або просто використовуючи -name:

find . -name 'Robert.*' -a \( -name '*.cpp' -o -name '*.h' \)

4
find -name "*Robert*" \( -name "*.pdf" -o -name "*.jpg" \)

Представники -o- ORумова, і ви можете додати скільки завгодно в дужки. Отже, це означає знайти всі файли, що містять слово "Роберт" де завгодно в їх іменах, імена яких закінчуються на "pdf" або "jpg".


3

Як альтернатива використанню -regexопції on find, оскільки питання позначене, ви можете скористатися механізмом розширення фігурних дужок:

eval find . -false "-o -name Robert".{jpg,pdf}

знайти звіт "шляхи повинні передувати виразу", в чому проблема? Зазвичай я додаю лапку, щоб вирішити це, але не працюю для цього виразу. Дякую!
netawater

Я підозрюю, що ви або забули, evalабо .команду вище, або ви findвикористовуєте псевдонім чогось більш складного, або ви не використовуєте GNU findу вашій версії Linux.
jxh

Дякую за відповідь, я використав такий сценарій: FILEEXTEIONS = cs, [ch] eval find. -false "-o -name *". {$ FILEEXTEIONS}, і він повідомляє про цю помилку.
netawater

Наскільки мені відомо, змінне розширення не відбуватиметься всередині фігурних дужок розширення.
jxh

1
Я хотів використовувати цю техніку в оболонці Android, але findвона не підтримує -false. Я працював навколо цього, даючи два взаємовиключних умови , щоб вони всі разом помилковими: -inum 1 -inum 2.
зоряна зірка


1

Як скрипт ви можете використовувати:

find "${2:-.}" -iregex ".*${1:-Robert}\.\(h\|cpp\)$" -print
  • зберегти як findcc
  • chmod 755 findcc

і використовувати його як

findcc [name] [[search_direcory]]

напр

findcc                 # default name 'Robert' and directory .
findcc Joe             # default directory '.'
findcc Joe /somewhere  # no defaults

зверніть увагу, що ви не можете використовувати

findcc /some/where    #eg without the name...

також як альтернативу ви можете використовувати

find "$1" -print | grep "$@" 

і

findcc directory grep_options

подібно до

findcc . -P '/Robert\.(h|cpp)$'

1

Використання баш-глобінгу (якщо findце не обов’язково)

ls Robert.{pdf,jpg} 

0

Повторно з ls: (-al для включення прихованих папок)

ftype="jpg"
ls -1R *.${ftype}  2> /dev/null
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.