Я пытаюсь ответить на эту проблему для класса COSC, который фокусируется на Linux/Unix.

Я использую Linux с оболочкой bash. Я новичок в Linux по состоянию на сентябрь.

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

Приведенная мной команда не учитывает, если имя файла начинается с четной цифры, за которой следует другая цифра с использованием символов подстановки. Это спорный момент, когда вопрос включен или исключен из задания, и я часами сидел, пытаясь решить эту проблему.

Это вообще возможно?

Я придумал:

echo [!02468][a-zA-Z]*

Любые предложения приветствуются и высоко ценятся.

4 ответа4

2

Вы также можете сделать следующее

shopt -s extglob
echo !([02468][a-zA-Z]*)
shopt -u extglob

Сначала вам нужно включить extglob с shopt -s extglob .
После этого вы можете снова отключить его с помощью shopt -u extglob .

Опция оболочки extglob обеспечивает более мощное сопоставление с образцом в командной строке.

0

Я не думаю, что это возможно с простой командой. Следующее должно сделать трюк, хотя:

for i in *; do
  case "$i" in
    [02468][a-zA-Z]*) ;; # do nothing
    *) echo "$i" ;;
  esac
done
0

следующее должно сделать трюк

echo !([02468][a-zA-Z])
0

Решение @ Rik с использованием extglob , вероятно, лучший способ для bash . Если вам нужен независимый от оболочки способ (если вы используете GNU find), попробуйте это:

find . -type f -not -name "[02468][a-zA-Z]*"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .