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:
{.[!.]*,..?*}