命令行批量重命名
Posted
技术标签:
【中文标题】命令行批量重命名【英文标题】:command line bulk rename 【发布时间】:2012-11-15 00:51:21 【问题描述】:我在多个子文件夹中有文件,我想将它们全部移动到一个文件夹中。 然后我想重命名这些文件。
/foo/A1000-foobar1412.jpg
/foo/A1000-foobar213.jpg
/foo/A1000-foobar314.jpg
/foo1/B1001-foobar113.jpg
/foo2/C1002-foobar1123.jpg
/foo2/C1002-foobar24234.jpg
我想得到的是:
../bar/A1000-1.jpg
../bar/A1000-2.jpg
../bar/A1000-3.jpg
../bar/B1001-1.jpg
../bar/C1002-1.jpg
../bar/C1002-2.jpg
所以到目前为止我所做的是:
find . -name "*.jpg" -exec mv ../bar/ \;
但现在我被困在重命名文件上。
【问题讨论】:
有多少重复项? ***.com/questions/12292232/…; ***.com/questions/10977543/…; ***.com/questions/417916/how-to-do-a-mass-rename; ***.com/questions/3540490/…; ... 没有一个像我的场景...... 好的...因为?因为前缀内的编号?当 C1002 有 10 个.jpg
文件时会发生什么? C1002-10.jpg
? C1002-01.jpg
,C1002-02.jpg
,……也是?是什么决定了/foo2/C1002-foobar1123.jpg
和/foo2/C1002-foobar24234.jpg
中的哪一个变成C1002-1.jpg
?有关系吗?
【参考方案1】:
这是一个脚本,它只获取文件所需的基本名称,并根据目标目录中已存在多少具有相同基本名称的文件附加一个增量索引:
for file in $(find . -name "*.jpg")
do
bn=$(basename $file)
target_name=$(echo $bn | cut -f 1 -d "-")
index=$(($(find ../bar -name "$target_name-*" | wc -l) + 1))
target="$target_name-$index.jpg"
echo "Copy $file to ../bar/$target"
# mv $file ../bar/$target
cp $file ../bar/$target
done
使用此解决方案,您不能只在 mv 前面放置一个 echo 来测试它,因为代码依赖于目标目录中的真实文件来计算索引。而是改用 cp(或 rsync)并在您对结果满意后立即手动删除源文件。
【讨论】:
【参考方案2】:试试这个(未测试):
for file in `find . -name "*.jpg" `
do
x=$(echo $file | sed 's|.*/||;s/-[^0-9]*/-/;s/-\(.\).*\./-\1./')
mv $file ../bar/$x
done
【讨论】:
更改为echo mv $file ../bar/$x
,使用该输出来确认一切是否正常工作,然后删除回显或使用done | bash
结束循环。祝大家好运。以上是关于命令行批量重命名的主要内容,如果未能解决你的问题,请参考以下文章