1つのフォルダに複数のファイルがあります。特定の順序でリストされたファイル名(拡張子なし)を含むcsvファイルもあります。ファイル名の先頭にテキストファイルリストの場所を含むようにフォルダのファイル名を変更したいと思います。
つまり、私のフォルダには次のものが含まれます。
aaa.txt, bbb.txt, ccc.txt
ファイル名.csvには次のものが含まれます。
ccc
aaa
bbb
私が得たいものは:
1_ccc.txt, 2_aaa.txt 3_bbb.txt
Bashでこれを行うことはできますか?
ベストアンサー1
for i in *.txt
do line=$(grep -nx -m 1 -- "${i%%.*}" filename.csv | cut -f 1 -d ':')
name=${line}_${i}
mv -- "$i" "$name"
done
説明する
"${i%%.*}"
: Kusalanandaが提案したように値を取得し、$i
値の尾からパターンを削除します(追加情報.*
パラメータ拡張)
grep -nF --
-x
全行と一致-m 1
1つの一致する行の後にファイルの読み取りを停止します(grep
ファイルが非常に長い場合はすべての行を読み取るのを防ぐため)。--
オプションの終わりを示すために使用されます(詳細- シェルから)-n
次の形式で、行自体の代わりに行番号を返します。2:aaa 3:bbb 1:ccc
cut -f 1 -d ':'
:
上記の結果から区切り文字を含むフィールド1を抽出します。