У меня возникли проблемы с использованием команды ls, подстановки файлов и команды grep. Рассмотрим следующее дерево файлов/каталогов.
abc/
def
ghi.txt
jkl
def/
f01
abc
abc.txt
ghi.txt
Предположим, если я хочу полностью игнорировать каталог abc/ и сообщать обо всем остальном. Попытка ls -lR -Iabc .
сообщает о файле /def/abc.txt, но игнорирует файл /def/abc
. Аналогично ls -lR . | grep -v abc
здесь тоже не годится. Есть ли способ сделать то, что я хочу, в bash?
В качестве альтернативы предположим, что я хочу игнорировать ghi.txt
, но сообщать abc/ghi.txt
. Есть ли способ сделать это в bash?
решение1
В bash, если включена расширенная подстановка, то вы можете использовать !(abc) для обратного сопоставления каталога abc
. Например, дано
$ tree
.
├── abc
│ ├── def
│ ├── ghi.txt
│ └── jkl
├── def
│ ├── abc
│ ├── abc.txt
│ └── f01
└── ghi.txt
2 directories, 7 files
и
$ shopt extglob
extglob on
затем
$ ls !(abc)
ghi.txt
def:
abc abc.txt f01