私のディレクトリに利用可能なファイルがあります。
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
読みやすく簡潔な方法はawk
ssystem
関数です。
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