Как найти каталоги (или файлы и т. д. )на основе выражения, которое применяется к путевому имени файла

В более старых версиях bashбыла такая же ошибка/ошибка, как и в

 cat <<< $var

Содержимое $varбудет подвергаться разбиению на слова (, но не подстановке ), и результирующие слова объединяются пробелами перед помещением во временный файл, установленный в качестве входных данных для команды cat.

Это было исправлено в bash -4.4 для согласования с другими оболочками, поддерживающими этот <<<оператор zsh.

Для более старых версий это еще один случай, когда вам нужно заключать свои переменные в кавычки.

Таким образом, если бы $IFSсодержало iили f, это могло бы объяснить несоответствие:

$ a='if' bash4.1 -c 'IFS=f; cat <<< $a'
i
$ a='if' bash4.4 -c 'IFS=f; cat <<< $a'
if

В любом случае обратите внимание, что -e 'if('является избыточным, поскольку, если текст содержит if(как слово, он также содержит слово if.

Также обратите внимание, что bashимеет встроенное сопоставление регулярных выражений -, так что вы всегда можете сделать

re='\<if\>'
if [[ $p =~ $re ]]; then
  printf '"%s" contains a "if" word\n' "$p"
fi

(по крайней мере, в таких системах, как Linux Mint и RHEL, где ERE имеют эти \<, \>, но если ваш grepподдерживает -w,вполне вероятно, что ERE также будут иметь \<и \>).

(выше — один из тех очень редких случаев, когда $pне нужно цитировать (хотя цитирование не повредит ), а$reнельзя цитировать (в противном случае его содержимое принимается не как регулярное выражение, а как фиксированная строка))

Со стандартным синтаксисом shвы также можете:

case +$p+ in
  (*[^[:alnum:]_]if[^[:alnum:]_]*)
    printf '"%s" contains a "if" word\n' "$p"
esac

Чтобы получить тот же эффект.

1
22.07.2020, 03:47
2 ответа
$ find. -type d -links 2 -path '*CDE*'
./foo/CDE/X
./foo/CDE/Z
./foo/CDE/W
./foo/CDE/Y
./bar/CDE/Q
./bar/CDE/V

Или используйте

find. -type d -links 2 -path '*/CDE/*'

, если вы знаете, что CDE— это имя подкаталога где-то в середине путей, которые вы ищете.

1
18.03.2021, 23:18
find. -type d -links 2 -name "CDE" -print

соответствует каталогам , чье базовое имя точно равноCDE(из-за-name CDE)и у которых нет дочерних каталогов (из-за-links 2).

Базовое имя файла — это бит после последнего /его пути. Например, базовое имя ./foo/CDE/WW. Из этого вы видите, что ни один из каталогов не соответствует обоим условиям.

Вы ищете

find. -type d -links 2 -path '*/CDE/*'

Опция -path patternверна, если

the current pathname matches pattern using the pattern matching notation described in Pattern Matching Notation.

В «Обозначении сопоставления с образцом» звездочка соответствует любой строке.

В качестве последнего примечания, -printиспользуется по умолчанию, если -okили -execне присутствуют, так что вы можете удалить его.

0
18.03.2021, 23:18

Теги

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