Я хочу выполнить некоторое действие (сказать chown
) на всех скрытых файлах в каталоге.
Я знаю что это .*
не хорошая идея, потому что она также найдет ток .
и родитель ..
каталоги (я знаю это rm
не будет воздействовать на .
и ..
но другие команды, включая chown
и chmod
, счастливо вступит в силу),
Но все мои скрытые файлы имеют различные имена!
Как должен я шарик для всех скрытых файлов в то время как, исключая .
и ..
?
Вы можете использовать следующий шаблон extglob
:
.@(!(.|))
.
соответствует литералу .
сначала
@ ()
- это шаблон extglob
, будет соответствовать одному из шаблонов внутри, так как у нас внутри только один шаблон, он выберет этот
! (. | )
- это еще один шаблон extglob
(вложенный), который соответствует любому файлу, у которого нет или один .
; Как мы сопоставили .
уже в начале, весь этот шаблон будет соответствовать всем файлам, начинающимся с .
кроме .
и ..
.
extglob
включен в интерактивных сеансах bash
по умолчанию в Ubuntu. Если нет, сначала включите его:
shopt -s extglob
Пример:
$ echo .@(!(.|))
.bar .foo .spam
GLOBIGNORE=".:.."
, чтобы скрыть расширение. и .. каталоги. Это также устанавливает параметр dotglob
: *
соответствует как скрытым, так и не скрытым файлам.
Вы также можете использовать
shopt -s dotglob
Здесь вы можете использовать команду find
. Например, что-то вроде
find -type f -name ".*" -exec chmod 775 {} \;
Это найдет скрытые файлы и изменит права доступа
Edit, чтобы включить комментарий @gerrit:
find -type f -maxdepth 1 -name ".*" -exec chmod 775 {} \;
Это ограничит поиск до текущего каталога вместо рекурсивного поиска.