在另一个目录中重命名重复文件(由 fdupes 标识)的更快方法?

在另一个目录中重命名重复文件(由 fdupes 标识)的更快方法?

我有一个目录,里面装满了期刊文章的 pdf 文件,其中大部分都是按其 bibtex 密钥命名的。前段时间我在外部硬盘驱动器上进行了备份,但我没有保持最新状态,并且有大量具有不同名称的重复项。我想让这两个目录恢复同步并删除多余的文件。

使用 fdupes,我已经识别了其中的一些,现在我有一个很好的配对列表。然而,外部驱动器上的大多数重复项都具有毫无意义的名称。我想将它们重命名为与第一个目录中的重复项相同,而不是删除它们并再次复制它们,因为它们太多了。所以我不想只使用rsync。

例如,如果 fdupes 输出为:

/home/articles/bibtex.pdf
/external/articles/morearticles44.pdf

有没有比写更快的方法

mv /external/articles/morearticles44.pdf /external/articles/bibtex.pdf

对于每对重复项?

答案1

根据我的经验fdupes,它输出文件的顺序可能不一致(我在使用该--delete选项时遇到了自己的问题)。这应该相当强大,因为它不需要文件按特定顺序排列(只要不同文件夹中始终有两个重复文件):

# note no trailing slash
source_dir=/home/articles
target_dir=/external/articles

fdupes "$target_dir" "$source_dir" |
  while IFS= read file; do
    case "$file" in
      "$source_dir/"*)
         source=${file##*/}
         ;;
      "$target_dir/"*)
         target=$file
         ;;
      '')
         if [ "$source" ] && [ "$target" ]; then
           echo mv -i "$target" "$target_dir/$source"
         fi
         unset source target
         ;;
    esac
  done

这只会打印出命令,当你确定你有你想要的东西时mv删除。echo此外,-i选项mv还会提示您是否要覆盖任何内容。

答案2

我将提出一个不同的工作流程(由哈森吉建议): 而不是使用fdupes您可以使用齐奏识别并处理重复项。

您需要使用远程根之一运行 Unison,否则它不会检测到相同的文件。所以跑

unison /home/articles/bibtex.pdf ssh://localhost/external/articles

Unison 将搅动一段时间并建议同步两棵树。选择同步>移动/external/articles/morearticles44.pdf的方向/external/articles/bibtex.pdf

相关内容