Я хотел бы перечислить все файлы Fortran 90 в bash без файлов, заканчивающихся на _tst.f90 . Моя лучшая попытка до сих пор

ls -l ../src/*[!_tst].f90

Согласно справке Bash о сопоставлении с образцом [!_tst] учитывает только единичные вхождения _ , t и s . Можно ли сказать bash, что _tst должна быть последовательностью? Скобки (_tst) , одинарные '_tst' и двойные кавычки "_tst" не работают.

3 ответа3

0

Если вы хотите найти все файлы, заканчивающиеся на f90, кроме тех, которые заканчиваются на _tst.f90, вы должны использовать команду:

find /spath/to/start/directory -name '*.f90' ! -name '*_tst.f90' -print

Изменить: это идет вниз по всему дереву. Если вы хотите ограничить себя текущим каталогом,

find /spath/to/start/directory -name '*.f90' ! -name '*_tst.f90' -maxdepth 1 -print
0

Строго отвечая на ваш вопрос: да, вы можете, но это не работает.

shopt -s extglob
ls -l ../src/*!(_tst).f90

Проблема в том, что !(...) будет счастливо совпадать с пустой строкой, поэтому любое имя файла foo_tst.f90 будет просто содержать * заглатывать первые семь символов.

Я не знаю bash-native способа сделать это без использования find(1).

В зш:

setopt extended_glob
ls -ld ../src/*.f90~*_tst.f90

При этом используется функция ~ extended_glob, где A~B приводит к чему-либо, совпадающему с A которое не соответствует B

0

Это расширение пути к shopt -s extglob :

shopt -s extglob
ls -l ../src/!(!(*.f90)|*_tst.f90)

который сообщает Bash, что он должен соответствовать чему-либо, что не соответствует ни одному из

  • не *.f90 , то есть что-нибудь, кроме файлов .f90 или

  • _tst.f90 , т.е. ваши тестовые файлы.

которые соответствуют только *.f90 файлы , кроме *_tst.f90

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

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