在bash中移动文件并自动重命名复制文件而不覆盖现有文件的方式

问题描述:

我正在用大量jpgs进行大量目录的重大重构,其中一些与其他目录中的文件具有相同的名称。我想将文件移动/复制到备用目录,并且如果名称与该目录中的另一个文件相匹配(重命名为IMG_238.jpgIMG_238_COPY1.jpgIMG_238_COPY2.jpg等),而不是覆盖现有文件,bash会自动重命名它们。在bash中移动文件并自动重命名复制文件而不覆盖现有文件的方式

我已经设置了一个脚本,它需要jpegs并将它们移动到基于exif数据的新目录中。移动一个jpg的脚本的最后一行是:mv -n "$JPEGFILE" "$DIRNAME"

我正在使用-n选项,因为我不想覆盖文件,但现在我必须去手动排序,不会被移动/复制。我的GUI自动执行此操作...是否有一种相对简单的方法在bash中执行此操作?

(万一它很重要,我在Mac OSX Lion中使用bash 3.2)。

+0

你正在使用什么发行版,还是需要跨发行版? – 2011-12-28 13:45:48

+0

我用bash 3.2使用Mac OSX Lion。我会更新我的问题。 – 2011-12-28 13:47:55

+2

你可能想看看[fdupes](http://premium.caribe.net/~adrian2/fdupes.html) - 它可以帮助你摆脱重复文件,所以你留下的任何文件“unmoved “由于相同的名称是真正不同的文件。 – holygeek 2011-12-28 14:29:52

这应该做到这一点

# strip path, if any 
fname="${JPEGFILE##*/}" 
[ -f "$DIRNAME/$fname" ] && { 
    n=1 
    while [ -f "$DIRNAME/${fname%.*}_COPY${n}.${fname##*.}" ] ; do 
     let n+=1 
    done 
    mv "$JPEGFILE" "$DIRNAME/${fname%.*}_COPY${n}.${fname##*.}" 
} || mv "$JPEGFILE" "$DIRNAME" 

编辑:改进。

+0

您可以放心地删除第一个''[-f“$ DIRNAME/$ JPEGFILE”]'' – holygeek 2011-12-28 14:05:59

+0

您也可以安全地删除拖尾或“'||” mv“$ JPEGFILE”...'' – holygeek 2011-12-28 14:06:36

+0

也把''done && mv''改成''完成; mv'' – holygeek 2011-12-28 14:07:47

您可以试试downloading并查看Ubuntu/Debian的基于Perl的rename是否有效。它具有sed型功能。答曰手册页(我的系统上,但脚本应该是相同的一个为链接):

“重命名”指定 作为第一个参数重命名根据规则提供的文件名。 perlexpr参数是一个Perl表达式 ,预计它将在Perl中修改$ _字符串,至少可以指定一些 文件名。如果给定的文件名没有被 表达式修改,它将不会被重命名。如果 命令行上没有给出文件名,则将通过标准输入读取文件名。

例如,重命名匹配“名为* .bak”剥去 扩展名的文件,你可能会说

rename 's/\.bak$//' *.bak 

要大写名称更低翻译,你会使用

rename 'y/A-Z/a-z/' * 
+0

谢谢 - 我会检查出来的。 – 2011-12-28 15:33:54