我有两个目录-A和B-包含一堆照片文件。目录A是我长期保存照片的位置,其中的文件顺序命名为“ Photo-1.jpg,Photo-2.jpg等”。
目录B是我从相机上载新照片的位置,并且命名约定是相机为文件命名的方式。我想出了如何在目录B上运行一些操作,以确保所有内容都根据需要采用.jpg格式(imagemagik转换),删除重复文件(fdupes),等等。
我现在的目标是将文件从B移到A,最后得到A中的新添加文件,这些文件根据上述A的命名约定依次命名。
我知道如何将文件移动到A中,然后在添加新文件后将其中的所有内容批量重命名(理论上每晚都会发生),但是我猜测必须有一种更有效的移动方式从B到A的文件,而不必每晚重新命名所有20,000+张照片,只是因为添加了一些新文件。
我想我的问题有两个部分-1)我找到了一个可行的解决方案(我们用mv每晚重命名所有照片),这有什么缺点吗?和2)如果存在弊端,并且存在一种更优雅的方法,那么谁能帮助一个脚本查看A中存在的最高编号的脚本,然后重命名文件,并附加到该编号上的B中。移到A了?
谢谢!
此bash
脚本只会将新文件从DiretoryB
移动并重命名为您的DirectoryA
路径。它还可以在DirectoryB
#!/bin/bash
aPath="./photos-A"
bPath="./photos-B"
aPattern="Photo-"
lNum=$(find $aPath -type f -name "*.jpg" -printf "%f\n" | \
awk -F'[-.]' '{if($2>m)m=$2}END{print m}')
while IFS= read -r -d $'\0' 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
如果不是递归的,for循环也可以做到。否则,globstar
是另一种选择。
#!/usr/bin/env bash
shopt -s extglob nullglob
filesa=(DirectoryA/*.jpg)
filesb=(DirectoryB/*.jpg)
latest=${filesa[@]::1}
start=${latest//+([^[:digit:]])}
end=$(( ${#filesb[@]} + start + 1 ))
for pic in "${filesb[@]}"; do
for ((n=start;n<=end;n++)); do
echo mv -v "$pic" DirectoryA/Photo-${n}.jpg
done
done
echo
。