![如何将 * 与目录中的隐藏文件相匹配](https://linux22.com/image/61235/%E5%A6%82%E4%BD%95%E5%B0%86%20*%20%E4%B8%8E%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E9%9A%90%E8%97%8F%E6%96%87%E4%BB%B6%E7%9B%B8%E5%8C%B9%E9%85%8D.png)
如何匹配给定目录中的隐藏文件
例如
如果我给出以下命令,它不会给出隐藏文件的结果,
du -b maybehere*/*
如何使用单个命令而不是使用来实现这个简单
du -b maybehere*/.* maybehere*/*
因为我需要在这里输入两次。
答案1
利用大括号扩展:
du -b maybehere*/{*,.[^.],.??*}
或者替代地
du -b maybehere*/{,.[^.],..?}*
这背后的逻辑可能并不明显,所以这里是解释:
*
匹配所有非隐藏文件.[^.]
匹配名称以单点开头,后跟非点的文件;第一种形式中只有 2 个字符的文件名。.??*
匹配至少 3 个字符长的隐藏文件..?*
与上面一样,但第二个字符必须是点
重点是排除当前目录和父目录的硬链接(.
和..
),但是以这样的方式包含所有普通文件,每个文件仅计算一次!
例如,最简单的就是写
du -b maybehere*/{.,}*
这意味着该列表包含一个点.
和“无”(在,
和 结束之间没有任何}
内容),因此所有隐藏文件(从点开始)和所有非隐藏文件(从“无”开始)将匹配。问题是这也会匹配.
and ..
,这很可能不是你想要的,所以我们必须以某种方式排除它。
关于大括号扩展的最后一句话。
支撑扩张是一种机制,您可以通过编写更少的字符来将更多文件/字符串/任何内容包含到命令行中。语法是{word1,word2,...}
,即它是一个以逗号分隔的字符串列表,以 开头{
和结尾}
。bash
手册给出了一个非常基本且同时非常常见的用法示例:
$ echo a{b,c,d}e
abe ace ade
答案2
由于您已经在使用 GNU 特定语法 ( -b
):
du -abd1 maybehere*/
这样,它就会du
列出目录中的文件maybehere*
(并且不排除点文件)。-d1
将磁盘使用情况的报告限制为下一级(包括带有 的非目录-a
)。
否则,对于包含隐藏文件(除了.
和..
)的 glob,每个 shell 都有自己的语法:
zsh
:du -b maybehere*/*(D)
ksh93
:(FIGNORE='@(.|..)'; du -b maybehere*/*)
bash
:(shopt -s dotglob; du -b maybehere*/*)
tcsh
:(set globdot; du -b maybehere*/*)
yash
:(set -o dot-glob; du -b maybehere*/*)
但要注意它包含
.
和..
包含它们的系统,其结果readdir()
是它几乎不可用。
答案3
另一种选择是可用的这里:
du -sm .[!.]* *
答案4
如果您只想列出隐藏目录或对隐藏目录进行操作,那么正如科斯塔斯所说,您可以使用
du -b maybehere*/.*
这将允许您操作隐藏的文件和目录。如果您只想要隐藏目录,那么您可以指定
du -b maybehere*/.*/