![在另一个目录中重命名重复文件(由 fdupes 标识)的更快方法?](https://linux22.com/image/52763/%E5%9C%A8%E5%8F%A6%E4%B8%80%E4%B8%AA%E7%9B%AE%E5%BD%95%E4%B8%AD%E9%87%8D%E5%91%BD%E5%90%8D%E9%87%8D%E5%A4%8D%E6%96%87%E4%BB%B6%EF%BC%88%E7%94%B1%20fdupes%20%E6%A0%87%E8%AF%86%EF%BC%89%E7%9A%84%E6%9B%B4%E5%BF%AB%E6%96%B9%E6%B3%95%EF%BC%9F.png)
我有一个目录,里面装满了期刊文章的 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
还会提示您是否要覆盖任何内容。