使用列表重命名文件

使用列表重命名文件

我的目录中有可用文件:

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

我想通过阅读上面的映射来重命名这四个文件。映射文件比目录中存在的实际文件具有更多信息。

我的文件应重命名为以下内​​容。

filename30_6
filename30_7
filename60_3
filename60_4

我怎样才能做到这一点?

注:我是一个数据库背景的人,对Unix了解甚少。

答案1

如果您的映射文件以逗号分隔,您可以执行以下操作:

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

答案2

一个可读的、简洁的方法是awks systemfunction

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

将为输入文件的每一行运行一个命令


命令概要

  • awk一个非常适合处理表格数据的 Unix 实用程序
  • -F','F字段分隔符”是一个逗号
  • system("mv " $1 " " $2)针对输入文件的每一行运行
    • system(x)在子 shell 中运行 x
    • $1$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

相关内容