bash - Shell globbing 排除目录模式

标签 bash shell glob

忽略可与 shell glob 关联使用的命令,我想完成从 glob 模式中排除所有目录和子目录中的特定目录模式。

假设我有这个目录结构:

+-- a
    +-- a1
         +-- assets
                  +-- a1-1
                         +-- a1-1.js
                  +-- a1-2
                         +-- a1-2.js
    +-- a2
         +-- a2.js
+-- b
    +-- b1
         +-- b1-2
                +-- b1-2-3
                         +-- assets
                                  +-- b1-2-3.js
    +-- b.js
+-- c
    +-- c.js

我想列出文件路径中没有 assets 的所有 js 文件。

到目前为止我尝试了什么:

$ shopt -s globstar extglob
$ ls ./**/!(assets)/**/*.js

不仅上面的模式实现了它的目标,它甚至显示了重复的输出。我知道我可以做这样的事情:

$ ls ./**/*.js | grep -v "assets"

或者任何其他可以通过管道传输的命令,我只想要一个纯 shell glob 模式。

预期输出:

a/a2/a2.js  
b/b.js  
c/c.js

最佳答案

迈克尔的回答是正确的。 ** 匹配过多(贪婪匹配),包括 assets

所以,对于这棵树:

.
|-- a
|   |-- a1
|   |   +-- assets
|   |       |-- a1-1
|   |       |   +-- a1-1.js
|   |       +-- a1-2
|   |           +-- a1-2.js
|   +-- a2
|       +-- a2.js
|-- assets
|   +-- xyz.js
|-- b
|   |-- b1
|   |   +-- b1-2
|   |       +-- b1-2-3
|   |           |-- assets
|   |           |   +-- b1-2-3.js
|   |           +-- test
|   |               |-- test2
|   |               |   +-- test3
|   |               |       +-- test4
|   |               |           +-- test4.js
|   |               +-- test.js
|   +-- b.js
|-- c
|   +-- c.js
+-- x.js

.js 文件是:

$ find . -name '*.js'
./x.js
./assets/xyz.js
./a/a2/a2.js
./a/a1/assets/a1-2/a1-2.js
./a/a1/assets/a1-1/a1-1.js
./c/c.js
./b/b.js
./b/b1/b1-2/b1-2-3/test/test2/test3/test4/test4.js
./b/b1/b1-2/b1-2-3/test/test.js
./b/b1/b1-2/b1-2-3/assets/b1-2-3.js

有一个 bash 变量 GLOBIGNORE做你想做的事。

所以,这会起作用:

$ GLOBIGNORE='**/assets/**:assets/**:**/assets'
$ ls -1 **/*.js
a/a2/a2.js
b/b1/b1-2/b1-2-3/test/test2/test3/test4/test4.js
b/b1/b1-2/b1-2-3/test/test.js
b/b.js
c/c.js
x.js

关于bash - Shell globbing 排除目录模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37561162/

相关文章:

linux - 用于打开终端并 cd 到变量目录的 Bash 脚本

bash - scp/localdir/root @ ubuntu的目标路径是什么?

python - 获取当前打开文件的完整路径

gulp - 如何使用 glob 模式仅标记文件而不标记文件夹?

javascript - 哪个 C 库具有执行 zsh 的递归 glob 的功能?

bash - 我可以将多少个参数传递给 bash 函数?

linux - 在 bash 中循环每个变量一次,而不是在第二个循环中每隔一个变量循环一次?

bash - 如何将变量设置为 Bash 中命令的输出?

linux - bash + bash 脚本有类似 log4j 的东西吗?

python - 什么是 glob2 模块?