リストを使用したファイル名の変更

リストを使用したファイル名の変更

私のディレクトリに利用可能なファイルがあります。

filename15_1
filename15_2
filename15_3
filename15_4

など。

ファイル名の変更方法に関するマッピング情報を含む他のファイルがあります。これはCSVファイルです。

filename15_1,filename30_6
filename15_2,filename30_7
filename15_3,filename60_3
filename15_4,filename60_4
filename15_5,filename60_5
filename15_6,filename60_6

上記のマッピングを読んでこの4つのファイルの名前を変更したいと思います。マップファイルには、ディレクトリ内の実際のファイルよりも多くの情報があります。

私のファイルの名前を次のように変更する必要があります。

filename30_6
filename30_7
filename60_3
filename60_4

どうすればいいですか?

注:私はデータベースの背景を持つ人であり、Unixについて知っていることはほとんどありません。

答え1

マッピングファイルがコンマで区切られている場合は、次のことができます。

while IFS=, read orig target; do
    mv "$orig" "$target"
done < mapping.txt

答え2

読みやすく簡潔な方法はawkssystem関数です。

awk -F',' 'system("mv " $1 " " $2)' mappingFile.csv

入力ファイルの各行に対してコマンドが実行されます。


コマンドの要約

  • awk表形式のデータ操作に最適なUnixユーティリティ
  • -F','Fフィールド区切り記号」はカンマです。
  • system("mv " $1 " " $2)入力ファイルの各行に対して実行
    • system(x)サブシェルでxを実行する
    • $1$2最初と2番目の列をそれぞれ参照してください。
    • "mv " $1 " " $2ビルドコマンドの暗黙的な接続
  • mappingFile.csvこの入力ファイルを使用してください

答え3

さて、これは非常に愚かな答えですが:

sed -e 's/^/mv /' -e 's/,/ /' $mapping_file | sh 

答え4

上記の答えを参照して、次のようにコードを修正しましたが、うまくいきます。

cd $SRCE
for file in *
do

while IFS="," read srce target
do
if [[ $file = $srce ]] ; then 
mv "$srce" "$target"
fi
done < map_lst
done

関連情報