コードのこの部分について何がわかりますか? [コピー]

コードのこの部分について何がわかりますか? [コピー]

スクリプトのこの部分は何をしますか?これはbashスクリプトの一部です。

for j in *.* ; do 
    cp $j ../../$name-S$i.gid/data/${j%%.*}$i.${j#*.}
    sed "s/$name-S/$name-S$i/" $j > ../../$name-S$i.gid/data/${j%%.*}$i.${j#*.}
done

「i」は1から特定の数字までのパラメータで、「$name」はフォルダ名の一部であることを忘れていました。

答え1

これは愚かなコードです。まず、明確にするために書き直しました(引用文も追加しました)。

for j in *.* ; do 
    target_file="../../$name-S$i.gid/data/${j%%.*}$i.${j#*.}"
    cp "$j" "$target_file"
    sed "s/$name-S/$name-S$i/" "$j" >"$target_file"
done

つまり、ファイルをコピーした直後に新しいファイルを上書きします。名前にドットが含まれているすべてのファイルに対してこれを行います(ただし、先頭にはないかもしれません。bash(in)の設定によって異なりますdotglob)。

ターゲットファイルパスは次のように構成されます。

  1. 別のディレクトリに入れてください。

  2. ファイル拡張子を削除します(すべての部分、つまり最初の点から始まるすべての部分)。

  3. 番号を追加してからi、前の内線番号を追加してください。

この呼び出しは、sed行の最初の発生(つまり拡張)のみ(再拡張)に置き換えます。$name-S$name-S$i

関連情報