问题描述
也许我只是想解决这个问题,并使其变得比原来更难。
这是我的问题。我有2个不同的脚本,可以下载各种图片文件。电子邮件中的第一次下载和下载的文件将进入/attachments/
目录。第二个脚本复制Google驱动器的内容,所有文件和文件夹都复制到~/gdrive/
目录中。我希望能够将所有图片文件从这些文件夹以及任何子文件夹移动到~/Pictures/$today
,并在文件名重复的情况下防止任何覆盖。我不介意使用2个单独的脚本来处理2个不同目录中的图片,但是我确实需要它能够获取起点子目录中的所有文件。它还需要能够处理各种文件扩展名。我当前的解决方案在普通扩展名.jpg,.png,.tiff等文件之后添加了一个编号扩展名,例如.~1~
。我不会丢失任何文件,但是在扩展名出现后,所有带有备份编号的文件都会丢失对我的项目毫无用处。这就是我目前正在使用的
TODAY=$(date +"%m-%d-%Y")
mkdir -p ~/Pictures/$TODAY &&
sudo find /attachments -type f -exec mv --backup=numbered -t ~/Pictures/$TODAY {} +
如果文件名重复,我的结果如下:
DSC07286.JPG
DSC07286.JPG.~1~
是否有比我正在做的更好的方法?有没有办法剖析文件名部分并重新组织它们,然后对目录中的所有文件进行递归处理?谢谢
解决方法
可以执行以下操作(未经测试;使用标准的小写变量名,并将索引放在扩展名的前面,以免使排序混乱):
for path in ~/Pictures/"$today"/*.JPG
do
index=0
for duplicate_path in "$path".~[0-9]*
do
new_path="${duplicate_path%%.*}${index}.JPG"
echo "$duplicate_path" "$new_path"
((++index))
done
done
如果您确信它做对了,只需将echo
替换为mv
即可实际移动文件。
这是我的解决方法。
#!/bin/bash
TODAY=$(date +"%m-%d-%Y")
NOW=$(date +"%D %T")
sudo mkdir -p /home/pi/Pictures/emailpics/$TODAY &&
sudo find /attachments -type f -exec mv --backup=numbered -t /home/pi/Pictures/emailpics/$TODAY/ {} + &&
for f in /home/pi/Pictures/emailpics/$TODAY/*.~?~
do
fullfilename=$f
filepath=$(dirname "$fullfilename")
filename=$(basename "$fullfilename")
fname="${filename%.*}"
bkpnum="${filename##*.}"
file="${fname%.*}"
ext="${fname##*.}"
sudo mv $f $filepath/$file$bkpnum.$ext
done
不能说我完全理解解析位的所有语法,但是它可以工作。也许其他人可以解释发生了什么。