ls с glob не работает в сценарии bash

мне нужно перечислить все подкаталоги каталога, за исключением тех, которые соответствуют любому из списка, заданного в качестве аргумента: "SUBDIR1, SUBDIR2,..., SUBDIRN.

Я пришел с решением (из многих источников) использования ls с шаблоном glob. Чтобы проверить концепцию, я попробовал в командной строке следующую последовательность, которая, кажется, работает:

DIR="/path/to/dirs"
EXCLUDELIST="subdir1,subdir2"
#transform in a glob pattern for excluding given subdirectories
EXCLUDE="!(${EXCLUDELIST//,/|})"
LIST=$(cd $DIR && ls -l -d $EXCLUDE | grep -E "(^d)" | awk '{print }')

однако, когда я положил его в bash-скрипт неизмененном Я получаю эту ошибку

ls: cannot access !(subdir1|subdir2): No such file or directory

что я ошибаетесь, когда вставляете этот код в скрипт?

5
задан terdon
источник

2 ответов

Деннис сказал вам, почему ваш сценарий терпит неудачу, но я хотел бы предложить более простой (и безопасный) способ сделать это. Разбор ls is почти всегда плохая идея, он может легко ломаться на имена файлов с пробелами или новыми строками или другими странными символами и не переносим через настройки локали. Кроме того, ваша команда очень сложна, включая несколько шагов. Почему бы не сделать все это в find?

DIR="/path/to/dirs"
EXCLUDELIST="subdir1,subdir2"
## Build the regular expression
EXCLUDE="${EXCLUDELIST//,/|.*}"
LIST=$(find "$DIR" -type d -regextype posix-awk -not -regex ".*$EXCLUDE.*")

кстати, ваш сценарий будет не как у вас написано, что вы построить шар до cd - ing в $DIR так он будет построен с учетом содержимого текущего каталога.

1
отвечен terdon 2014-12-29 18:05:49
источник

интерактивные и неинтерактивные оболочки bash не ведут себя одинаково. Одним из многих отличий является то, что вариант оболочки extglob включен по умолчанию для интерактивных оболочек (по крайней мере, в моей версии bash), но не для неинтерактивных.

чтобы исправить скрипт, включите extglob со следующей командой:

shopt -s extglob
6
отвечен Dennis 2014-02-10 19:52:32
источник

Другие вопросы bash command-line