迭代目录中内容的正确方法

迭代目录中内容的正确方法

我需要遍历目录中的每个文件。我看到的一种常见方法是使用以 开头的 for 循环for file in *; do。但是,我意识到它不包含隐藏文件(以“.”开头的文件)。另一种明显的方法是然后做类似的事情

for file in `ls -a`; do

然而,迭代ls是一个坏主意,因为文件名中的空格会把一切搞乱。迭代目录并获取所有隐藏文件的正确方法是什么?

答案1

您只需要创建一个全局匹配文件的列表,用空格分隔:

for file in .* *; do echo "$file"; done

编辑

上面的可以使用大括号扩展以不同的形式重写

 for file in {.*,*}; do echo "$file"; done

甚至更短:for file in {.,}*; do echo "$file"; done

添加所选文件的路径:

 for file in /path/{..?,.[!.],}*; do echo "$file"; done

添加所选文件的路径:

 for file in /path/{.,}*; do echo "$file"; done

如果您想变得复杂并从列表中删除通常不需要的内容...只需更改{.,}*{..?,.[!.],}*.

为了完整起见,值得一提的是,还可以设置 dotglob 以将点文件与纯*.

shopt -s dotglob

需要zsh另外设置nullglob以防止在不匹配的情况下出现错误:

setopt nullglob

或者,也可以将 glob 限定符添加N到模式中:

for file in /path/{.,}*(N); do echo "$file"; done

相关内容