パターンに基づいてサブディレクトリ名を抽出する

パターンに基づいてサブディレクトリ名を抽出する

シェル変数に保存されているパスのリストがありますtmp。たとえば、次のようになります。

/abc/bcd/def/ZRT834/ZRT834_9/5678/S1_L001_R1.tar
/abc/bcd/def/ZRT834/ZRT834_9/5678/S2_L001_I1.tar
/abc/bcd/def/ZRT834/ZRT834_9/5678/S1_L001_I2.tar
/abc/bcd/def/ZRT207/ZRT207_1/5678/S1_L001_R1.tar
/abc/bcd/def/ZRT207/ZRT207_1/5678/S1_L001_R2.tar
/abc/bcd/def/ZRT207/ZRT207_1/5678/S1_L001_I2.tar

パスの一致パターンに基づいて新しいディレクトリを作成したいと思います。上記の例では、ディレクトリをZRT834_9作成し、そのディレクトリのファイルへのZRT207_1ソフトリンクを作成したいと思います。tar

ZRT834_9私の出力は次S1_L001_R1.tarのようになりますS2_L001_I1.tarS1_L001_I2.tar

どうやってこれを達成できますか?

ベストアンサー1

存在するzsh

files=(
  /abc/bcd/def/ZRT834/ZRT834_9/5678/S1_L001_R1.tar
  /abc/bcd/def/ZRT834/ZRT834_9/5678/S2_L001_I1.tar
  /abc/bcd/def/ZRT834/ZRT834_9/5678/S1_L001_I2.tar
  /abc/bcd/def/ZRT207/ZRT207_1/5678/S1_L001_R1.tar
  /abc/bcd/def/ZRT207/ZRT207_1/5678/S1_L001_R2.tar
  /abc/bcd/def/ZRT207/ZRT207_1/5678/S1_L001_I2.tar
)
# or files=(${(f)"$(<list.txt)"}) to get the file list from the non-empty
# lines of list.txt, or files=($=tmp) for word splitting the contents
# of a $tmp scalar variable according to the current value of $IFS.

for file ($files) {
  dir=${file:h5:t}
  mkdir -p -- $dir && ln -s -- $file $dir/
}

-comComponent1のヘッダーと結果の尾を${file:h5}取得する位置です。または最後から数えることができます。5h$file:t${file:t3:h1}


¹ここ要素パスコンポーネントです。たとえば、コンポーネントは、、、、および../a//b///c/./d/eです。与え、降伏する。 andを適用する前に、仕様への絶対パスの取得も参照してください。..abc.de:h5../a//b///c/.:t.${file:A:h5:t}:h5:t

おすすめ記事