7

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

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

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

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

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

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

5 ответов5

11

* Совпадёт . персонаж.

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

В zsh:

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

В bash:

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

В GNU find:

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

3

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

ls -ld {,.}*vim*
ls -ld *vim* .*vim*
find . -maxdepth 1 -name "*vim*"
3

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

shopt -s dotglob

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

2

В ZSH (без изменения GLOB_DOTS) вы можете сделать

  ls -lad *vim*(D)
1

Чтобы основываться на ответе @daniel kullman, это, кажется, выполняет то, что вы хотите, с довольно простым глобусом, хотя это не является строго единственным гангом.

Рекурсивно ищите строку "blah" во всех файлах в текущем каталоге, включая скрытые файлы, исключая «..», который вызывает поиск в структуре родительского каталога:

grep blah {,.}[!.]*

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .