Первая отправленная вами команда не может дать результаты, которые вы показываете, потому что у них нет двоеточий в конце; по-видимому, вы их раздели. Сценарий, на который вы ссылаетесь, делает это для выбора путей к каталогам, которые ls -R
отображаются с добавленным двоеточием, но ничто не препятствует тому, чтобы имя файла и путь заканчивались двоеточием и давали ложное срабатывание. Это также вводит в заблуждение ваш заголовок; вы хотите сохранить большинство каталогов и исключить только несколько.
Заданный вопрос: Существует несколько различных «разновидностей» (стандартов) регулярных выражений, наиболее похожих, но с важными различиями в деталях. Есть два общих принципа в программном обеспечении Unix и Unix: простое регулярное выражение (BRE) и расширенное регулярное выражение (ERE). В большинстве оболочек (и стандартном поиске) используется еще более простая форма для сопоставления имен файлов (и вариантов регистра) (только? * И [...]), которая даже не называется регулярным выражением, а просто шаблоном. Существует еще более расширенная форма, определенная Perl, но используемая вне ее, называется Perl Compatible Regular Expression (PCRE). См. Почему мое регулярное выражение работает в X, но не в Y? и http://en.wikipedia.org/wiki/Regular_Expression .
Ваш (?!
"взгляд вперед" есть только в PCRE, тогда как стандартный grep
по умолчанию выполняет BRE или ERE с -E
, хотя он кажется версии grep
могут выполнять PCRE, или вы можете получить и установить отдельный pcregrep
. Но вам это не нужно. Если вам нужны не скрытые дочерние элементы curr dir, просто выполните '^ \ ./ \ w'
или '^ \ ./ [^.]'
в зависимости от того, насколько строгими вы хотите быть. Но вы говорите, что не хотите скрытый каталог в любом месте пути, что труднее сделать с положительным регулярным выражением и намного проще с отрицательным соответствием, например grep -v '/\.'
.
Обратная косая черта является особенной в обоих bash (и большинство, если не все оболочки) и grep (BRE или ERE), поэтому они должны быть либо удвоены \\
, либо заключены в одинарные кавычки; я предпочитаю последнее. Обратите внимание, что двойных кавычек здесь недостаточно.
Лучшие подходы:
на самом деле вам нужны только пути к каталогам, поэтому, как предлагают другие ответы find -type d | grep -v / \.
- лучший подход. Это не тратит время на перечисление имен обычных файлов, которые вы затем отбрасываете. В качестве альтернативы вы можете просто использовать ls -R | grep: $
без -a
; по умолчанию ls
уже пропускает скрытые записи (как обычные файлы, так и каталоги). Как это делает сценарий, на который вы ссылаетесь!
Файлы в разделе /usr
предназначены для управления менеджером пакетов (за исключением файлов в разделе /usr/local
). Конфигурационные файлы, которые системный администратор может изменять в режиме реального времени, находятся в /etc
. Это часть традиционной структуры каталогов unix и кодифицировано для Linux в стандарте Filesystem Hierarchy Standard. Рекомендация в Arch Wiki редактировать файлы в разделе /usr
- плохая идея; ожидается, что ваши изменения будут перезаписаны при обновлении.
Arch Linux управляет файлами несколько нестандартным способом. Вы можете пометить файл как не подлежащий изменению при обновлении (это документировано в вики), заявив об этом в /etc/pacman. conf
:
NoUpgrade = usr/share/config/kdm/Xsetup
/usr/share/config/kdm/Xsetup можно заменить /usr/share/config/kdm/Xsetup
на символическую ссылку на файл в разделе /etc
(например, /etc/kdm/Xsetup
), чтобы было проще отслеживать сделанные вами настройки.