Как использовать выражение-оболочку _one_ для вывода списка всех файлов (конечно, скрытых файлов тоже!)?

1689
math

Хорошо, этот вопрос адресован оболочкам Unix / Linux! Мне нужно выражение оболочки globbing- (также называемое wildchard-), которое соответствует всем файлам, включая скрытые файлы в текущем каталоге, не рекурсивно (maxdepth == 1). До сих пор мне приходилось выполнять две команды или использовать длинные обходные пути (см. Ниже):

ls -lad *vim* ls -lad .*vim* 

при использовании Zsh. Но если я помню то же самое для тире и бэша, верно?

Короткие обходные пути:

  • ls -la | grep vim
  • find . -maxdepth 1 | grep vim

Но я задавался вопросом сто раз, разве нет простого решения для этого и почему *он не соответствует точечному символу?

7

5 ответов на вопрос

11
JdeBP

* это сопоставить .характер.

Это просто не соответствует, .когда это первый символ имени. Это обеспечивает так называемый механизм «точечного файла» для «скрытия» файлов.

В zsh:

Установите параметр GLOB_DOTSоболочки. Это в § 14.8 руководства zshпользователя. Обратите внимание, что .и ..всегда исключаются, даже если эта опция включена.

В bash:

Установите параметр dotglobоболочки. Это в п. 3.5.8 руководства bashпользователя. Обратите внимание, что установка GLOBIGNOREпеременной оболочки неявно устанавливает dotglob; что bash(в отличие от zsh) не исключает автоматически .и ..когда dotglobвключено; но это bash будет сделано, когда GLOBIGNOREустановлено. Так что настройка GLOBIGNORE=.будет иметь эффект включения dotglob и исключения .и ...

В GNU find:

Ничего не делай Начиная с findutils4.2.2, глобализация для -nameи -iname уже соответствует именам с точками в качестве первого символа. Это в п. 2.1.1 руководства findutilsпользователя.

БУДЬТЕ ОСТОРОЖНЫ с этим! В Bash. * Соответствует всему, включая один каталог вверх. Corporal Touchy 12 лет назад 3
3
grawity

В bash включите опцию dotglob :

shopt -s dotglob 

По умолчанию скрытые файлы скрыты, чтобы не вызывать неожиданностей и раздражений - например, вы запускаете lsв своем домашнем каталоге, просматриваете некоторые файлы с прошлого месяца, пытаетесь удалить их rm *net*и неосознанно уничтожить тщательно написанные вами .nethackrc.

Да, действительно, включать его по умолчанию не очень хорошая идея !, но, к счастью, Zsh может устанавливать и сбрасывать опции через: `setopt` и` unsetopt`, поэтому я могу включить его, когда мне это нужно чаще, и отключить его впоследствии , math 12 лет назад 1
3
daniel kullmann

Если вы не хотите изменять какие-либо параметры, подойдет любой из них:

ls -ld {,.}*vim* ls -ld *vim* .*vim* find . -maxdepth 1 -name "*vim*" 
почему между скобками стоит запятая? Разве `*` также не совпадает с запятой в начале имени файла? Два других я уже дал как обходные пути. math 12 лет назад 0
@math: в bash вы можете использовать такие вещи, как ` x` →` ax bx cx`, поэтому `{,.} * vim *` расширяется до двух аргументов `* vim *. * vim *` grawity 12 лет назад 3
2
simou

In ZSH (without changing GLOB_DOTS) you could do

 ls -lad *vim*(D) 
1
user58389

To build on the answer of @daniel kullman, this seems to accomplish what you want with a fairly simple glob, though its not strictly a single gob.

Recursively search for the string "blah" in all files in the current directory, including hidden files, and excluding the ".." that causes the parent directory structure to be search:

grep blah {,.}[!.]* 

Похожие вопросы