Bash globbing - autoexpand для нескольких конкретных случаев?

Я понимаю, что подстановочный знак * (сам по себе) будет расширяться таким образом, что это означает "все не скрытые файлы в текущей папке" со скрытыми файлами, которые являются префиксами периода.

Есть два варианта использования, которые я считаю полезными, но я не знаю, как правильно это сделать:

  • Как вы можете глотать для... "Все файлы в текущей папке, включая скрытые файлы, но не включая . или .."?

  • Как вы можете глотать для... "Все скрытые файлы (и только скрытые файлы) в текущей папке, но не включая . или .."?

Ответ 1

Чтобы развернуть paviums и ответить на вторую часть вашего вопроса, все файлы, кроме . и .., могут быть указаны следующим образом:

{.[!.]*,*}

В зависимости от вашего конкретного варианта использования, возможно, лучше установить параметр оболочки dotglob, так что bash по умолчанию включает в себя dotfiles в расширениях *:

$ shopt -s dotglob
$ echo *
.tst

Ответ 2

Bash Cookbook предлагает решение для вашего второго требования.

.[!.]*

как способ задания "точечных файлов", но избегая . и ..

Конечно, ls имеет параметр -A, но это не глобус.

Ответ 3

Чтобы выполнить свой первый случай:

echo {.,}[^.]*

или

echo {.,}[!.]*

Edit

Кажется, что это все, но короче ephemient

echo {.*,}[^.]*

Ответ 4

Сочетание ответов sth и pavium

# dot files but avoiding . and ..
.[!.]*

# all files but avoiding . and .. 
{.[!.]*,*}

Ответ 5

Под "все файлы" и "все скрытые файлы" вы подразумеваете только файлы, или вы имеете в виду как файлы, так и каталоги? Globbing работает с именами независимо от того, что они принадлежат файлу или каталогу. Другие люди дают хорошие ответы на использование globbing для поиска скрытых или не скрытых имен, но вы можете обратиться к команде find в качестве более простой альтернативы, которая может различать типы.

Чтобы найти "Все файлы в текущей папке, включая скрытые файлы, но не включая. или..":

find . -type f

Найти "Все файлы и каталоги в текущей папке, включая скрытые файлы, но не включая.":

find . ! -name .

Найти "Все скрытые файлы (и только скрытые файлы) в текущей папке, но не включая.":

find . -name '.*' -type f

Найти "Все скрытые файлы и каталоги (и только скрытые файлы и каталоги) в текущей папке, но не включая.":

find . -name '.*' ! -name .

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

find . -maxdepth 1 -type f

Ответ 6

Итак, хотя это и старо - без использования магазина, на это, похоже, не ответили полностью. Но, расширяя то, что было дано в качестве ответов, они работают для меня:

1

{*,.[!.]*,..?*}

2:

{.[!.]*,..?*}