目标:我试图在目录中递归地查找*.clj
或*.cljs
文件的所有实例,将它们存储在字符串变量中(用换行符分隔),然后转换它们。
clj(s)
因此,如果在我的目录中找到以下文件dir1
:
/dir1/dir2/hello1.clj
/dir1/dir2/hello2.clj
/dir1/dir2/hello3.cljs
/dir1/dir2/hello4.clj
/dir1/dir2/hello5.cljs
比方说,我的转换只是返回每个字符串的基本名称:
/dir1/dir2/hello1.clj -> hello1.clj
/dir1/dir2/hello2.clj -> hello2.clj
/dir1/dir2/hello3.clj -> hello3.clj
/dir1/dir2/hello4.clj -> hello4.clj
/dir1/dir2/hello5.clj -> hello5.clj
那么我怎样才能写一个f
函数
$ VAR=$(f dir1)
满足
$ echo "$VAR"
hello1.clj
hello2.clj
hello3.clj
hello4.clj
hello5.clj
?
试图:
我知道我可以通过生成目录的.clj
和文件.cljs
FOUND_FILES=$(find "dir1" -type f -regex ".*\.\(clj\|cljs\)")
我可以使用该basename
命令来获取文件的基本名称。剩下的怎么办?
答案1
你可以这样做球体和参数扩展。如果您有必须启用语法find
的 bash 版本(bash4+),则无需使用。globstar
**
# Enable `**`, and expand globs to 0 elements if unmatched
shopt -s globstar nullglob
# Put all files matching *.clj or *.cljs into ${files[@]} recursively
files=(dir1/**/*.clj{,s})
# Print all files delimited by newlines, with all leading directories stripped
printf '%s\n' "${files[@]##*/}"
要应用某些任意转换,请将最后一行替换为:
for file in "${files[@]}"; do
some-arbitrary-transformation <<< "$file"
done
答案2
shopt -s globstar nullglob
var="$(echo **/*.clj **/*.cljs | xargs -n1 basename)"
echo "$var"