0

我正在编写一个 bash 脚本,它将图像从一个目录(及其所有子目录)复制到另一个目录。

到目前为止,我有这个:

find . -type f -regextype posix-extended -regex '^.*IMG_[0-9]{4}\.jpg' -exec cp {} ~/$output \;

这行得通,但问题比这更复杂。有两种情况:

  • 一些图像具有相同的名称,但不同。在这种情况下,只需在名称末尾添加第二个“.JPG”即可对其进行重命名。
  • 但是,如果两个文件具有相同的名称并且是相同的文件,则应仅将一个复制到输出目录,而将另一个的绝对路径写入文本文件-duplicates.txt。

我在想我需要在文件名上使用 cmp 然后 md5sum 来检查相同的文件,但我不确定如何在文件名上使用 cmp ,或者这是否可能。

提前感谢您的帮助!

4

1 回答 1

1

这还没有完全测试,但这对你有用吗?基本上只是循环输出find,检查您指定的条件,并执行适当的操作。输入目录作为第一个参数传递,输出作为第二个参数。

#!/bin/bash

input=$1
output=$2
logfile=~/duplicates.txt

while IFS= read -r -d '' f
do
    #strip the input directory name from the file
    f=${f/$input\//}
    echo Working with $f
    #check if the file exists
    if [ -f "$output/$f" ]; then
        if cmp -s "$input/$f" "$output/$f"; then
            #file is identical
            echo "$f" >> "$logfile"
        else
            #same filename, but different file
            cp --parents -p "$input/$f" "$output/$f.JPG"
        fi
    else
        cp --parents -p "$input/$f" "$output/$f"
    fi
done< <(find "$input" -type f -regextype posix-extended -regex '^.*IMG_[0-9]{4}\.jpg' -print0)
于 2015-11-19T17:48:42.573 回答