ファイル名にリスト行をプレフィックスとして追加

ファイル名にリスト行をプレフィックスとして追加

ファイル名に「_」プレフィックスでリスト要素を追加するには?

ファイル名:

aaa.gf
bbr.gf
cee.gf

リスト.txt:

pplo
125ss
35w2

望ましい結果:

pplo_aaa.gf
125ss_bbr.gf
35w2_cee.gf

すべての要素は同じフォルダにあります。すべてのオブジェクトファイルは.gfで終わります。 list.txtの行は、例に示すように、アルファベット順にファイル名と一致する必要があります。

停止しました:

for f in *.gf; do mv "$f"  LINE_"$f"; done

LINEを操作する方法がわかりません。

ありがとうございます。

答え1

どうですか?

mapfile -t list < list.txt

i=0
for f in *.gf; do 
  echo mv "$f" "${list[i++]}_$f"
done

echo正しいことをしていると思われる場合は削除してください。

答え2

POSIXsh構文を使用します。

#! /bin/sh -
for f in *.gf; do
  IFS= read -r line <&3 || break
  mv -i -- "$f" "${line}_$f"
done 3< list.txt

Globbing(ここで*.gf)はファイルリストを語彙順にソートします(最新およびPOSIX互換シェルのロケールの組み合わせに応じて)。

答え3

このpaste(1)ユーティリティを使用してください(遅いシェルループを防ぎ、全体的に簡単です)。

# example list of files:
ls > files

paste -d_ list files

必要に応じてmv状況がやや複雑になります。

paste -d_ list files | paste files - | xargs -n2 echo mv

echo離れる準備ができたら削除してください。

なぜなら私たちは除いて

すべてがPOSIXshと互換性がある必要があるため、移植性に優れています。

しかし、私の好きな部分は簡単に、インタラクティブに、1つずつ組み合わせることができるということです。

答え4

GNU並列処理を使用する:

parallel mv {1} {2}_{1} ::::+ filenames list.txt

または:

parallel mv {1} {2}_{1} ::: * ::::+ list.txt

関連情報