Команда find с несколькими шаблонами не возвращает никаких выходных данных

Вы развернули экземпляр с частным и общедоступным (плавающим IP) интерфейсами. Я мог видеть, что плавающий IP-адрес назначен вашему экземпляру. Пожалуйста, подтвердите, есть ли общедоступная сеть (172.24.4.0) в вашей сетевой среде openstack, и настроили ли вы интерфейс нейтронного моста?

Если это так, вы можете получить доступ к экземпляру из внешней сети, используя IP-адрес (172.24.4.12).

0
21.06.2017, 01:18
3 ответа
pat="'*.ab' -o -name '*.bc'"
find $path -type f $open -name $pat $close

Это не то, что вам нужно. :кавычки внутри переменной patвоспринимаются не как кавычки, а как буквальные символы. После расширения $patоно разбивается на слова, в результате чего слова '*.ab', -o, -nameи '*.bc'сохраняются с одинарными кавычками. Поэтому, если у вас нет имен файлов с одинарными кавычками внутри, это не будет совпадать.

path=path

Это устанавливает переменную pathв литеральную строку path, но я полагаю, что это был просто заполнитель.

open="\("
close="\)"

Они помещают буквальные обратные косые черты в переменные, и find, вероятно, должен пожаловаться, так как он получает аргумент \(. Достаточно один раз поставить скобку, поэтому либо open="(", либоopen=\(

Если вам нужно построить список выражений для find, используйте оболочку с массивами (Bash или почти что угодно, но только не простуюsh):

args=()  
args+=( -name "*.ab" )
args+=( -or -name "*.bc" ) 

find... \( "${args[@]}" \)

Оберните построение массива -в цикл, если это необходимо.

2
28.01.2020, 02:19

Используйте простой подход (вместо игры с переменными):

find $path -type f -name "*.ab" -o \( -name "*.bc" \)
0
28.01.2020, 02:19

Вы используете переменную неправильного типа и забыли заключить ее в кавычки.

Здесь вам нужен массив для хранения более одного аргумента:

#! /bin/bash -
pat=('*.ab' -o -name '*.bc')
open='('
close=')'
path=path

find "$path" -type f "$open" -name "${pat[@]}" "$close"

Обратите внимание, что аргумент *.abи (вы хотите передать в find, а не '*.ab'или \(. Эти кавычки и обратная косая черта являются частью синтаксиса оболочки.

Это только в том случае, если вы хотите построить командную строку оболочки, например, чтобы перейти к evalдля оценки оболочки, что вы бы сделали:

#! /bin/bash -
pat="'*.ab' -o -name '*.bc'"
open="\("
close="\)"
path=path

eval 'find "$path" -type f '"$open -name $pat $close"

Для последующей оценки оболочкой:

find "$path" -type f \( -name '*.ab' -o -name '*.bc \)

Что, как указано выше, приводит к вызову findс этими аргументами:

  • find
  • path(содержание$path)
  • -type
  • f
  • (
  • *.ab
  • -o
  • -name
  • *.bc
  • )
2
28.01.2020, 02:19

Теги

Похожие вопросы