将由换行符分隔的文件列表转换为变量

将由换行符分隔的文件列表转换为变量

目标:我试图在目录中递归地查找*.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"

相关内容