linux - 将文件批量移动到目录中,并根据该目录中的顺序语法重命名这些文件

linux - batch move files into a directory and rename those files according to sequential syntax in that directory

我有两个目录 - A 和 B - 包含一堆照片文件。 A目录是我长期保存照片的地方,里面的文件依次命名为"Photo-1.jpg, Photo-2.jpg, etc."。

目录 B 是我从相机上传新照片的地方,命名约定是相机为文件命名的。我想出了如何 运行 目录 B 上的一些操作以确保所有内容都根据需要采用 .jpg 格式(imagemagik 转换),删除重复文件(fdupes)等

我现在的目标是将文件从 B 移动到 A,并根据 A 的上述命名约定按顺序命名 A 中新添加的文件。

我知道如何将文件移动到 A,然后在添加新文件后批量重命名 A 中的所有内容(理论上每晚都会发生),但我猜一定有更高效的方法将文件从 B 移动到 A 而无需每晚重新命名所有 20,000 多张照片的方法,只是因为添加了一些新文件。

我想我的问题分为两个部分 - 1) 我找到了一个可行的解决方案(我们每晚都重命名所有照片),这有什么缺点吗?和 2) 如果存在缺点并且存在更优雅的方法,任何人都可以帮助脚本查看 A 中存在的最高数字,然后重新命名文件,附加到 B 中的那个数字上,因为它们移到 A 了吗?

谢谢!

bash 脚本只会将 DiretoryB 中的新文件移动并重命名到您的 DirectoryA 路径中。它还处理带有空格的文件名 and/or 名称中的任何其他奇数字符 DirectoryB

#!/bin/bash

aPath="./photos-A"
bPath="./photos-B"
aPattern="Photo-"

lNum=$(find $aPath -type f -name "*.jpg" -printf "%f\n" | \
  awk -F'[-.]' '{if(>m)m=}END{print m}')
while IFS= read -r -d $'[=10=]' photo; do
        mv "$photo" "$aPath/$aPattern$((++lNum)).jpg"
done < <(find $bPath -type f -name "*.jpg" -print0)

备注

查找最后编号照片的命令,又名 $lNum 运行 遍历所有 20K+ 文件,但它应该相当快。如果不是,您总是可以 运行 这一次并将最新的数字存储到文件中并从该文件中读取。

概念验证

$ tree photos-A/
photos-A/
├── Photo-1.jpg
├── Photo-2.jpg
├── Photo-3.jpg
├── Photo-5.jpg
├── Photo-6.jpg
├── Photo-7.jpg
└── Photo-8.jpg

0 directories, 7 files

$ tree photos-B/
photos-B/
├── bar.jpg
├── baz\ with\ spaces.jpg
└── foo.jpg

0 directories, 3 files

$ ./mvphoto.sh

$ tree photos-A/
photos-A/
├── Photo-10.jpg
├── Photo-11.jpg
├── Photo-1.jpg
├── Photo-2.jpg
├── Photo-3.jpg
├── Photo-5.jpg
├── Photo-6.jpg
├── Photo-7.jpg
├── Photo-8.jpg
└── Photo-9.jpg

0 directories, 10 files