我需要遍历目录中的每个文件。我看到的一种常见方法是使用以 开头的 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