ターゲット:私はディレクトリ内のファイルのすべてのインスタンスを再帰的に*.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
あなたはこれを行うことができます球そしてパラメータ拡張。構文を有効にする必要があるbashバージョン(bash4 +)がある場合はfind
必要ありません。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"