我的目录中有可用文件:
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
一个可读的、简洁的方法是awk
s system
function
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