ファイル名に「_」プレフィックスでリスト要素を追加するには?
ファイル名:
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