2015-10-18 141 views
1

我试图将目录中的照片移动到一个目录中查找。它的效果很好:移动照片并重命名它们,如果它们存在?

find /origin/path \(-iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.JPG' -o -iname '*.JPEG' -o -iname '*.PNG' -o -iname '*.png' -o -iname '*.gif' -o -iname '*.GIF' \) -type f -exec mv -nv -t /final/path -- {} +; 

如何重命名文件,如果他们有相同的名称(但不同的照片)?

+1

这是我们如何欢迎新用户?当他们提出一个正确的,关于主题的shell脚本问题时,我们通过关闭题目来有效地告诉他们消失了吗?是的,我知道我们从应该关闭的新用户那里获得大量低质量的垃圾问题。这不是其中的一个。 – hlovdal

回答

3

您可以使用mv的--backup=t选项。这会将增加编号的后缀追加到目标已存在的文件。

$ find /tmp/test -type f 
/tmp/test/dir2/image.jpg 
/tmp/test/dir3/image.jpg 
/tmp/test/dir1/image.jpg 
/tmp/test/dir4/image.jpg 
$ mkdir /tmp/test2 
$ find /tmp/test -iname '*.jpg' -print0 | xargs -0 mv -v --backup=t --target-directory=/tmp/test2 
‘/tmp/test/dir2/image.jpg’ -> ‘/tmp/test2/image.jpg’ 
‘/tmp/test/dir3/image.jpg’ -> ‘/tmp/test2/image.jpg’ (backup: ‘/tmp/test2/image.jpg.~1~’) 
‘/tmp/test/dir1/image.jpg’ -> ‘/tmp/test2/image.jpg’ (backup: ‘/tmp/test2/image.jpg.~2~’) 
‘/tmp/test/dir4/image.jpg’ -> ‘/tmp/test2/image.jpg’ (backup: ‘/tmp/test2/image.jpg.~3~’) 
$ 
0

对不起,我没有,因为我现在在Windows上,但低于脚本应该这样做

files_list=$(find /origin/path \(-iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.JPG' -o -iname '*.JPEG' -o -iname '*.PNG' -o -iname '*.png' -o -iname '*.gif' -o -iname '*.GIF' \) -type f) 

for file in ${files_list} 
do 
    counter=0 
    while true 
    do 
     if [[ ! -a ${file} ]] 
     then 
      mv "${file}" "/final/path/${file}" 
      break 
     else 
      file="${file}${counter}" 
      ((counter++)) 
     fi 
    done 
done 
+0

如果文件名包含空格或水平字符,这将会打破悲惨。不要使用! –

相关问题