Цикл sh для всех файлов в каталоге и подкаталогах, соответствующих шаблону

Я хочу перебрать файлы, соответствующие шаблону. Они могут находиться в текущем каталоге или подкаталогах.

Я пытался:

 for file in **/$_pat*; do

но он находит файлы только в подкаталогах. Я также добавил следующую команду в bashrc, а также в скрипт, но она все равно не работает.

shopt -s globstar

shopt не распознается в сценарии.

shopt: not found                              

Используйте найти: find 'some-path' -type f -iname '*pattern*'

0stone0 10.04.2023 19:46

@Discussian Я изменил свой вопрос, решение здесь не сработало

Ahmad 10.04.2023 19:55

Неинтерактивные bash-скрипты обычно не читают bashrc. Вы должны поставить shopt -s globstar внутри вашего скрипта.

Discussian 10.04.2023 19:57

@Discussian Я поместил это в сценарий, и это не сработало, принятый ответ хороший, дубликатов нет

Ahmad 11.04.2023 10:37

@Discussian Мой сценарий sh не bash, поэтому команда там не распознается.

Ahmad 11.04.2023 10:44

Ну, вы поставили "bash" в заголовке и тегах, так что... Но да, find более переносим, ​​это правда.

Discussian 11.04.2023 11:18

Если бы вы использовали sh вместо bash, и **, и shopt выдавали бы сообщение об ошибке; но в любом случае, занимаясь программированием, не гадайте, какой язык программирования вы используете, а вместо этого решите, какой из них вы собираетесь использовать.

user1934428 11.04.2023 11:37

@ user1934428 Извините, что? Теперь я должен перечислить все свои проблемы, чтобы убедить вас, почему я использую определенный скрипт? Я просто сообщил о проблемах. ** не доставило никаких проблем, а shopt — да. вот и все.

Ahmad 11.04.2023 12:56

@Discussian изменил bash на sh

Ahmad 11.04.2023 12:59

@Ahmad: Не поймите меня неправильно, но я нашел это запутанным. В своем первом сообщении вы пометили скрипт как bash и публиковали команды bash. Теперь вы помечаете его как sh, где команды bash не имеют смысла. Вот почему я говорю, что сначала вы должны решить, какой язык вы выбираете, а затем вы можете подумать о командах, которые будете использовать. На самом деле, использование bash или zsh было бы хорошей идеей для вашей проблемы, но если вы настаиваете, вы, конечно, можете решить ее немного сложнее в sh.

user1934428 11.04.2023 13:01

@ user1934428 спасибо, верно! это было ш! и я должен был использовать его правильно. Но примите меня, эти термины сбивают с толку, и много раз я решал свои проблемы, ища более распространенный bash.

Ahmad 11.04.2023 13:05

@user1934428 user1934428 Мне просто интересно, кто отдает ему голоса, когда у него есть решение и оно не дублируется, потому что эти решения не работают в sh

Ahmad 11.04.2023 13:07

@Ahmad: Может быть, глупый вопрос: почему вы вынуждены использовать sh?

user1934428 11.04.2023 13:08

Я получил несколько ошибок, которые я не могу вспомнить, я думаю, что одна из них заключалась в том, что bash не распознал aliases, который я определил в сценарии. Теперь я могу проверить и сказать больше

Ahmad 11.04.2023 13:09

@Ahmad: Понижение может означать одно из: Вопрос не требует хороших исследований. Вопрос не ясен. Вопрос не полезный. Я думаю, что в вашем случае основная проблема заключается в том, что вопрос, который (в его первой версии) был о bash, показал разумный код bash, но не объяснил, в чем код был неправильным (вы никогда не показывали сообщение об ошибке). Просто включение буквального сообщения об ошибке из вашего shopt сообщило бы всем, что вы не используете bash. Отсутствие описания «неправильного поведения» обычно приводит к отрицательному результату.

user1934428 11.04.2023 13:11

@ user1934428 изменил вопрос.

Ahmad 11.04.2023 13:20

@Ahmad Теперь вопрос кажется мне разумным. Мне просто интересно: действительно ли сообщение об ошибке от shopt shopt: not found, или это что-то вроде sh: shopt: not found, или, может быть, sh: команда не найдена?

user1934428 11.04.2023 13:25

Это train.sh: 33: shopt: not found , я даже проверил его с новым файлом, например #!/bin/sh shopt -s globstar, и получил ту же ошибку.

Ahmad 11.04.2023 14:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
18
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте find:

find "$_path" -type f -iname "*your_pattern*"

Где:

-iname = сопоставление шаблона без учета регистра

-type f = ищет только обычные файлы, опуская каталоги или ссылки

Чтобы использовать его в цикле:

find "$_path" -type f -iname "*your_pattern*"|while read file
do
echo "$file"
done

Цикл for не будет работать, если в результатах есть пробелы, а while читает каждую строку while

В зависимости от того, что вы хотите сделать в качестве конечной цели, вы можете использовать -exec в поиске, например:

find "$_path" -type f -iname "*your_pattern*" -exec echo {} \;

где {} будет представлять соответствующую строку/файл`

Также вам нужно \; в конце

Как использовать его вместе с for?

Ahmad 10.04.2023 19:56

Я обновил свой ответ, хотя вам нужно добавить больше деталей и показать, какова ваша конечная цель... так как мы можем предоставить здесь множество решений, но не знаем, какое из них вам больше всего подходит.

Ron 10.04.2023 20:00

спасибо, я попробую и приму или оставлю отзыв

Ahmad 10.04.2023 20:01

Другие вопросы по теме