Почему этот шаблон не работает в bash? [dубликат]

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

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

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

Как я должен glob для всех скрытых файлов, исключая . и ..?

22
задан 26 September 2016 в 13:21

8 ответов

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

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

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

shopt -s extglob

Пример:

$ echo .@(!(.|)) .bar .foo .spam
20
ответ дан 18 July 2018 в 03:35

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

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

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

shopt -s extglob

Пример:

$ echo .@(!(.|)) .bar .foo .spam
20
ответ дан 24 July 2018 в 17:53
GLOBIGNORE=".:.."

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

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

shopt -s dotglob

Gilles :)

20
ответ дан 18 July 2018 в 03:35

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

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

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

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

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

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

8
ответ дан 18 July 2018 в 03:35
GLOBIGNORE=".:.."

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

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

shopt -s dotglob

Gilles :)

20
ответ дан 24 July 2018 в 17:53

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

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

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

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

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

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

8
ответ дан 24 July 2018 в 17:53
  • 1
    Возможно, вы захотите добавить здесь -maxdepth 1, чтобы он более точно соответствовал поведению в вопросе и другим ответам. – gerrit 26 September 2016 в 17:18
  • 2
    Хороший улов. Благодаря ;-) – Wayne_Yux 27 September 2016 в 10:32
 GLOBIGNORE=".:.."

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

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

shopt -s dotglob

Gilles:)

20
ответ дан 5 August 2018 в 03:19

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

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

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


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

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

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

8
ответ дан 6 August 2018 в 20:12

Другие вопросы по тегам:

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