Я хочу перебрать файлы, соответствующие шаблону. Они могут находиться в текущем каталоге или подкаталогах.
Я пытался:
for file in **/$_pat*; do
но он находит файлы только в подкаталогах. Я также добавил следующую команду в bashrc
, а также в скрипт, но она все равно не работает.
shopt -s globstar
shopt
не распознается в сценарии.
shopt: not found
@Discussian Я изменил свой вопрос, решение здесь не сработало
Неинтерактивные bash-скрипты обычно не читают bashrc. Вы должны поставить shopt -s globstar
внутри вашего скрипта.
@Discussian Я поместил это в сценарий, и это не сработало, принятый ответ хороший, дубликатов нет
@Discussian Мой сценарий sh
не bash
, поэтому команда там не распознается.
Ну, вы поставили "bash" в заголовке и тегах, так что... Но да, find
более переносим, это правда.
Если бы вы использовали sh вместо bash, и **
, и shopt
выдавали бы сообщение об ошибке; но в любом случае, занимаясь программированием, не гадайте, какой язык программирования вы используете, а вместо этого решите, какой из них вы собираетесь использовать.
@ user1934428 Извините, что? Теперь я должен перечислить все свои проблемы, чтобы убедить вас, почему я использую определенный скрипт? Я просто сообщил о проблемах. ** не доставило никаких проблем, а shopt — да. вот и все.
@Discussian изменил bash на sh
@Ahmad: Не поймите меня неправильно, но я нашел это запутанным. В своем первом сообщении вы пометили скрипт как bash и публиковали команды bash. Теперь вы помечаете его как sh, где команды bash не имеют смысла. Вот почему я говорю, что сначала вы должны решить, какой язык вы выбираете, а затем вы можете подумать о командах, которые будете использовать. На самом деле, использование bash или zsh было бы хорошей идеей для вашей проблемы, но если вы настаиваете, вы, конечно, можете решить ее немного сложнее в sh.
@ user1934428 спасибо, верно! это было ш! и я должен был использовать его правильно. Но примите меня, эти термины сбивают с толку, и много раз я решал свои проблемы, ища более распространенный bash.
@user1934428 user1934428 Мне просто интересно, кто отдает ему голоса, когда у него есть решение и оно не дублируется, потому что эти решения не работают в sh
@Ahmad: Может быть, глупый вопрос: почему вы вынуждены использовать sh?
Я получил несколько ошибок, которые я не могу вспомнить, я думаю, что одна из них заключалась в том, что bash
не распознал aliases
, который я определил в сценарии. Теперь я могу проверить и сказать больше
@Ahmad: Понижение может означать одно из: Вопрос не требует хороших исследований. Вопрос не ясен. Вопрос не полезный. Я думаю, что в вашем случае основная проблема заключается в том, что вопрос, который (в его первой версии) был о bash, показал разумный код bash, но не объяснил, в чем код был неправильным (вы никогда не показывали сообщение об ошибке). Просто включение буквального сообщения об ошибке из вашего shopt
сообщило бы всем, что вы не используете bash. Отсутствие описания «неправильного поведения» обычно приводит к отрицательному результату.
@ user1934428 изменил вопрос.
@Ahmad Теперь вопрос кажется мне разумным. Мне просто интересно: действительно ли сообщение об ошибке от shopt
shopt: not found, или это что-то вроде sh: shopt: not found, или, может быть, sh: команда не найдена?
Это train.sh: 33: shopt: not found
, я даже проверил его с новым файлом, например #!/bin/sh shopt -s globstar
, и получил ту же ошибку.
Используйте 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
?
Я обновил свой ответ, хотя вам нужно добавить больше деталей и показать, какова ваша конечная цель... так как мы можем предоставить здесь множество решений, но не знаем, какое из них вам больше всего подходит.
спасибо, я попробую и приму или оставлю отзыв
Используйте найти:
find 'some-path' -type f -iname '*pattern*'