Как я должен Glob для всех скрытых файлов?

22

Я хочу выполнить какое-то действие (скажем chown) над всеми скрытыми файлами в каталоге.

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

Но все мои скрытые файлы имеют разные имена!

Как мне найти все скрытые файлы, исключая .и ..?

Занна
источник

Ответы:

20

Вы можете использовать следующий extglobшаблон:

.@(!(.|))
  • .соответствует литералу .сначала

  • @()является extglobшаблоном, будет соответствовать одному из шаблонов внутри, так как у нас есть только один шаблон внутри, он выберет

  • !(.|)другой extglobшаблон (вложенный), который соответствует любому файлу без или с одним .; Как мы уже совпали .при запуске, весь этот шаблон будет соответствовать всем файлам, начиная с .кроме .и ...

extglobвключен в интерактивных сессиях bashпо умолчанию в Ubuntu. Если нет, сначала включите его:

shopt -s extglob

Пример:

$ echo .@(!(.|))
.bar .foo .spam
heemayl
источник
Это, безусловно, потрясающая вещь, о которой мне нужно узнать! Спасибо за обучение
Занна
@Zanna Рад, что я мог помочь :)
Heemayl
2
Какова цель @()? Простой, .!(.|)кажется, работает одинаково.
Кайл Стрэнд,
1
Я знаю, что это старый, но у меня такой же вопрос, как @KyleStrand. В моих тестах !(.|)работает так же. Есть ли какая-то цель @()в этом контексте?
Пэдди Ландау
Является ли характер взрыва отрицанием? Это не упоминается, и, читая ваше объяснение, у меня складывается впечатление, что шаблон соответствует точке и двойной точке, но вы четко описываете файлы, которые соответствуют начальной точке, за исключением только этих двух.
пользователь неизвестен
20
 GLOBIGNORE=".:.."

чтобы скрыть и .. каталоги. Это также устанавливает dotglobпараметр: *сопоставляет как скрытые, так и не скрытые файлы.

Вы также можете сделать

shopt -s dotglob

Жиль :)

Rinzwind
источник
9

Вы можете использовать findкоманду здесь. Например что-то вроде

find -type f -name ".*" -exec chmod 775 {} \;

Это позволит найти скрытые файлы и изменить разрешения


Изменить, чтобы включить комментарий @gerrit:

find -type f -maxdepth 1 -name ".*" -exec chmod 775 {} \;

Это ограничит поиск по текущему каталогу вместо рекурсивного поиска.

Wayne_Yux
источник
4
Возможно, вы захотите добавить -maxdepth 1сюда, чтобы оно более точно соответствовало поведению в вопросе и другим ответам.
геррит