我试图在 wordpress 安装中递归更改文件权限,影响 public_html 文档根文件夹下的所有内容,不包括某些文件夹。
我已经设置了 extglob shopt -s extglob
当我运行以下命令时,它无法排除我希望它排除的文件夹
ls -R -alh ./public_html/!(*uploads*) | grep uploads
上面列出了上传文件夹中的许多文件——它不应该列出任何文件。
当然上面的命令只是一个测试;我将chmod在实际脚本中使用。
我尝试了许多不同的组合,但都失败了;例如,以下内容:
ls -R -alh ./public_html/!(wp-content/uploads*)
Run Code Online (Sandbox Code Playgroud)
ls: 无法访问 ./public_html/!(wp-content/uploads*): 没有那个文件或目录
这是我第一次尝试在 shell 命令中使用排除项,我可能犯了一个简单的错误。
任何想法我做错了什么?
请注意:问题的目的是为了更好地理解 extglob 而不是寻找替代方案。我可以编写替代脚本,但因为在我无法理解语法之前我从未使用过 extglob。
首先,extglob 控制ls在其命令行上看到的内容。它并不会管什么ls用它认为在命令行上一样。这很重要,因为该-R选项ls告诉递归ls探索它在命令行上看到的任何目录。因此,即使没有在命令行上明确给出目录,也会在浏览其父目录时找到它们。*uploads*ls
其次,如您所知,不要解析 ls。的输出ls不适用于管道或脚本。试图以这种方式使用它最终会导致不快乐。
第三,要获取您想要的文件,请尝试:
find ./public_html ! -path '*uploads*'
Run Code Online (Sandbox Code Playgroud)
解释:
该./public_html告诉找到开始寻找在./public_html目录中。
就其本身而言,该选项-path '*uploads*'匹配任何包含模式的路径*uploads*。(-path类似于 find 的-name选项,但path包括目录名称。)!然而,前面的表示否定。因此,该选项! -path '*uploads*'排除任何路径匹配*uploads*。
要ls在仍然使用 的功能的同时获得样式输出find,请考虑:
find ./public_html ! -path '*uploads*' -exec ls -dalh {} +
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1416 次 |
| 最近记录: |