Bash 命令行批量重命名

Bash 命令行批量重命名,bash,unix,ubuntu,rename,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 ../

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

/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/ \;
但现在我无法重命名文件。

试试这个(未测试):


下面是一个脚本,它仅获取文件的所需basename,并根据目标目录中已存在的具有相同basename的文件的数量附加一个增量索引:

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

更改为
echo mv$file../bar/$x
,使用该输出确认所有工作正常,然后删除echo或使用
done | bash
结束循环。祝大家好运。有多少份副本。。。没有一个像我的场景…好吧…因为?因为前缀中的编号?当C1002有10个
.jpg
文件时会发生什么<代码>C1002-10.jpg<代码>C1002-01.jpg,
C1002-02.jpg
。。。也是什么决定了
/foo2/C1002-foobar1123.jpg
/foo2/C1002-foobar24234.jpg
中的哪一个会变成
C1002-1.jpg
?这有关系吗?
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