如何将 * 与目录中的隐藏文件相匹配

如何将 * 与目录中的隐藏文件相匹配

如何匹配给定目录中的隐藏文件

例如

如果我给出以下命令,它不会给出隐藏文件的结果,

 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*/.*/

相关内容