需要脚本来移动和重命名文件而不会覆盖重复的文件名

问题描述

也许我只是想解决这个问题,并使其变得比原来更难。 这是我的问题。我有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

不能说我完全理解解析位的所有语法,但是它可以工作。也许其他人可以解释发生了什么。