假设我有以下目录结构:
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
有什么建议吗?
不确定你对 find 有何反对意见,只需付出一点努力就可以使其非常具有可扩展性(即使在 MAC 上):
FILE_PATTERN=(txt css)
IFS='|'
find -E -iregex ".*(${FILE_PATTERN[*]})"
我没有 Mac 可以玩,但我认为 -E 选项应该适合你,如果没有,请查看手册页:)
根据@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
前两个结果不成功的原因是 bash 仅扩展参数的全局变量,而不是在分配变量时扩展全局变量。这意味着现在 FILE_PATTERN 包含文字字符串(就好像您在 echo 中在它们周围加了引号一样)并且之后不会扩展。
最后一个无需调用外部程序即可工作,但需要
shopt -s globstar
,这在 bash 中不可用 < 4.0 (see https://unix.stackexchange.com/a/379192/438671)所以这就是例如不适用于 MacOS 的默认 bash