如何在bash中使用 *通配符,但排除父目录(..)?

前端之家收集整理的这篇文章主要介绍了如何在bash中使用 *通配符,但排除父目录(..)?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有时我想对目录中的所有文件(包括隐藏文件)执行命令。当我尝试使用
chmod g+w * .*

它改变了我想要的所有文件(在目录中)和父目录中的所有文件的权限(我想孤独)。

通配符做正确的事情,还是我需要开始使用find?

你将需要两个glob模式来覆盖所有潜在的“点文件”:。[^。] *和..?*。

第一个匹配具有两个或更多字符的所有目录条目,其中第一个字符是点,第二个字符不是点。第二个选择具有三个或更多字符的以..开头的条目(这排除..因为它只有两个字符,以。开头,但包括(不太可能的)条目,如..foo)。

chmod g+w .[^.]* ..?*

这应该在大多数所有shell都很好,适合于脚本。

对于常规的交互使用,模式可能太难记住。对于这些情况,你的shell可能有一个更方便的方法跳过。和…
zsh总是排除。和..从像。*。
使用bash,您必须使用GLOBIGNORE shell变量。

# bash
GLOBIGNORE=.:..
echo .*

您可以考虑在其中一个bash自定义文件(例如.bash_profile / .bash_login或.bashrc)中设置GLOBIGNORE。
但是,如果您经常使用其他环境,请小心,习惯于这种定制。
如果在缺少定制的环境中运行类似chmod g w。*的命令,那么您将意外地结束包括。和..在你的命令。

此外,您可以将shell配置为在不以显式点(例如*)开头的模式中包含“点文件”。

# zsh
setopt glob_dots

# bash
shopt -s dotglob


# show all files,even “dot files”
echo *

猜你在找的Bash相关文章