改行で区切られたファイルのリストを変数に変換

改行で区切られたファイルのリストを変数に変換

ターゲット:私はディレクトリ内のファイルのすべてのインスタンスを再帰的に*.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"

関連情報