命令行批量重命名

时间:2012-11-27 11:47:08

标签: bash unix ubuntu rename

我有多个子文件夹中的文件,我想将它们全部移动到一个文件夹中。 然后我想重命名这些文件。

/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/ \;

但现在我不得不重命名文件。

2 个答案:

答案 0 :(得分:2)

这是一个脚本,它只获取文件所需的基本名称,并根据目标目录中已存在多少具有相同基本名称的文件附加增量索引:

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)并在对结果满意后立即手动删除源文件。

答案 1 :(得分:1)

试试这个(未经测试):

for file in `find . -name "*.jpg" `
do
  x=$(echo $file | sed 's|.*/||;s/-[^0-9]*/-/;s/-\(.\).*\./-\1./')
  mv $file ../bar/$x
done