Glob 并包含当前目录和递归子目录

问题描述 投票:0回答:3

假设我有以下目录结构:

file.txt
file.css
file.js
directory/file.txt
directory/file.css
directory/file.js
directory/subdirectory/file.txt
directory/subdirectory/file.css
directory/subdirectory/file.js

我希望能够找到所有目录中的所有

txt
css
文件(理想情况下不使用
find
,因为我希望我编写的命令是可扩展的)。文件扩展名列表应位于名为
FILE_PATTERN
的变量中。

该命令最终应输出:

  • directory/subdirectory/file.css
  • directory/subdirectory/file.txt
  • directory/file.css
  • directory/file.txt
  • file.css
  • file.txt

但是我尝试的每个通配模式都没有返回结果:

$ FILE_PATTERN="{**/,}*.{css,txt}"
$ echo $FILE_PATTERN
# FAILS: Returns 0 results

$ FILE_PATTERN={**/,}*.{css,txt}
$ echo $FILE_PATTERN
# FAILS: Returns 0 results

$ echo {**/,}*.{css,txt}
# FAILS: Only returns:
directory/file.css directory/file.txt file.css file.txt

有什么建议吗?

bash
3个回答
0
投票

不确定你对 find 有何反对意见,只需付出一点努力就可以使其非常具有可扩展性(即使在 MAC 上):

FILE_PATTERN=(txt css)

IFS='|'
find -E -iregex ".*(${FILE_PATTERN[*]})"

我没有 Mac 可以玩,但我认为 -E 选项应该适合你,如果没有,请查看手册页:)


0
投票

根据@grail的回复,我最终选择了这个:

FILE_EXTENSIONS="txt|css"
find -E . -iregex ".*\\/[^\\/]+\\.(${FILE_EXTENSIONS})\$"
./directory/file.css
./directory/file.txt
./directory/subdirectory/file.css
./directory/subdirectory/file.txt
./file.css
./file.txt

0
投票

前两个结果不成功的原因是 bash 仅扩展参数的全局变量,而不是在分配变量时扩展全局变量。这意味着现在 FILE_PATTERN 包含文字字符串(就好像您在 echo 中在它们周围加了引号一样)并且之后不会扩展。

最后一个无需调用外部程序即可工作,但需要

shopt -s globstar
,这在 bash 中不可用 < 4.0 (see https://unix.stackexchange.com/a/379192/438671)所以这就是例如不适用于 MacOS 的默认 bash

© www.soinside.com 2019 - 2024. All rights reserved.