Используйте регулярные выражения и обратное сопоставление и передайте его другой команде - PullRequest
2 голосов
/ 26 ноября 2011

Дело в том, что у меня есть собственный скрипт bash, который выполняет определенные действия над указанной папкой, с синтаксисом:

myscript $1 $2 $3

Где $1 - имя папки, а $2, $3 - другие необходимые числовые аргументы для задания.

Допустим, у меня есть каталог со многими папками, например:

a
b
c
d
ref-1
ref-2
ref-3

Мне нужно выполнить скрипт только в папке, не начинающейся с ref-. Поскольку мне потребовалось бы много усилий для выполнения сценария вручную для каждого из файлов, я хочу выяснить, как можно использовать регулярные выражения для ограничения только нужными папками, используя обратное сопоставление, например «extglob», и для каждый из них выполняет сценарий с указанными аргументами $2 и $3.

Ответы [ 4 ]

3 голосов
/ 26 ноября 2011

Вы можете $(ls -d */|grep -v ^ref-), например.

1 голос
/ 27 ноября 2011

Это должно сделать это для вас -

Используя опцию find -type d, вы ограничиваете поиск по каталогам. Предоставление pattern with -not -name может помочь вам игнорировать соответствующие каталоги. -exec option может помочь вам запустить сценарий оболочки для всех найденных каталогов. {} \; просто означает буферное пространство для exec для выполнения сценария оболочки для каждого каталога по одному. -depth n обеспечит снижение до уровня каталогов.

find . -not -name ref\* -not -name .\* -type d -depth 1 -exec ./script.sh {} \;

UPDATE:

Плохо, я забыл об обработке двух пользовательских параметров. Я, возможно, не эксперт, но самый простой способ, которым я мог бы подумать, это отправить результат поиска в файл и затем запустить цикл for для этого файла.

Как то так -

[jaypal~/Temp]$ find . -not -name ref\* -not -name .\* -type d -depth 1 > dirlist
[jaypal~/Temp]$ for i in dirlist; do ./script.sh $i param1 param2; done

Альтернативный способ передачи пользовательских параметров (в соответствии с предложением @dma_k)

[jaypal~/Temp]$ find . -not -name ref\* -not -name .\* -type d -depth 1 | xargs script.sh param1 param2
1 голос
/ 27 ноября 2011

Это может работать для вас:

ls !(ref-?)

или

ls !(ref*)

или

ls +({a..d})

или просто

ls ?

РЕДАКТИРОВАТЬ:

Затем скрипт можно запустить так:

for first in !(ref-?); do script.sh $first $second $third; done

Где second и third - числовые аргументы.

0 голосов
/ 26 ноября 2011

Как насчет ls | grep yourRegexHere

...