我想chown
对目录中的所有隐藏文件执行一些操作(比如说)。
我知道这.*
是不是这是一个好主意,因为它还会找到当前目录.
和父..
目录(我知道对和rm
进行操作将失败,但其他命令,包括和,将很乐意生效).
..
chown
chmod
但我所有隐藏文件都有不同的名称!
我应该如何在排除.
和的同时将所有隐藏文件全部包含进去..
?
答案1
在 Bash 中,GLOBIGNORE
按如下方式设置变量:
GLOBIGNORE=".:.."
隐藏.
和..
目录。这还会设置dotglob
选项,以便 glob*
字符现在匹配隐和非隐藏文件。GLOBIGNORE
如上所示设置变量只会影响当前终端会话和顶级进程,除非您将其导出并将其~/.bashrc
作为 添加到文件中export GLOBIGNORE=".:.."
。
您还可以执行以下操作:
shopt -s dotglob
答案2
您可以使用以下extglob
模式:
.@(!(.|))
.
.
首先匹配文字@()
是一个extglob
模式,将匹配其中的一个模式,因为里面只有一个模式,所以它会选择那个!(.|)
是另一个extglob
模式(嵌套),它匹配没有或有一个 的任何文件.
;正如我们已经.
在开始时匹配的那样,整个模式将匹配以.
except.
和开头的所有文件..
。
extglob
在 Ubuntu 中,默认情况下在交互式会话中启用bash
。如果没有,请先启用它:
shopt -s extglob
例子:
$ echo .@(!(.|))
.bar .foo .spam
答案3
您可以find
在此处使用命令。例如
find -type f -name ".*" -exec chmod 775 {} \;
这将找到隐藏文件并更改权限
编辑以包含@gerrit 的评论:
find -type f -maxdepth 1 -name ".*" -exec chmod 775 {} \;
这将限制搜索当前目录的顶部,而不是递归搜索。
答案4
如果有人需要不需要启用环境变量或 shell 选项的替代方案,dotglob
或者extglob
您可以使用以下命令:
.[!.]*
它有效,因为它至少匹配两个字符,其中第二个字符不能是点 ( .
)
我之所以想到这个问题,是因为我正在寻找一种匹配点文件和非点文件的方法,您可以使用:
{.[!.]*,*}
与两个选项中的任意一个匹配。
我需要一个不需要环境变量或 shell 选项的 glob;原因是我需要一个可以在 VSCode 的findFiles
API 中工作的 glob,该 API 支持 glob(请参阅https://code.visualstudio.com/api/references/vscode-api#3906),但没有提供 shell 选项或等效选项的空间dotglob
。extglob
这些工具决定使用 *NIX 方式进行 glob 操作,这很好。