我应该如何查找所有隐藏文件?

我应该如何查找所有隐藏文件?

我想chown对目录中的所有隐藏文件执行一些操作(比如说)。

我知道这.*不是这是一个好主意,因为它还会找到当前目录.和父..目录(我知道对和rm进行操作将失败,但其他命令,包括和,将很乐意生效)...chownchmod

但我所有隐藏文件都有不同的名称!

我应该如何在排除.和的同时将所有隐藏文件全部包含进去..

答案1

在 Bash 中,GLOBIGNORE按如下方式设置变量:

GLOBIGNORE=".:.."

隐藏...目录。这还会设置dotglob选项,以便 glob*字符现在匹配非隐藏文件。GLOBIGNORE如上所示设置变量只会影响当前终端会话和顶级进程,除非您将其导出并将其~/.bashrc作为 添加到文件中export GLOBIGNORE=".:.."

您还可以执行以下操作:

shopt -s dotglob

来源:Gilles 的回答在这里:)

答案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 的findFilesAPI 中工作的 glob,该 API 支持 glob(请参阅https://code.visualstudio.com/api/references/vscode-api#3906),但没有提供 shell 选项或等效选项的空间dotglobextglob这些工具决定使用 *NIX 方式进行 glob 操作,这很好。

相关内容