![删除父文件夹中的重复项 OS X](https://linux22.com/image/1533723/%E5%88%A0%E9%99%A4%E7%88%B6%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%AD%E7%9A%84%E9%87%8D%E5%A4%8D%E9%A1%B9%20OS%20X.png)
我正在寻找一些我确信非常简单的事情 - 希望使用类似于这样的终端命令:如何比较和删除 El Capitan 上多个文件夹之间的重复文件?。
我一直将照片保存在多个目录中,采用以下两种格式之一:
短途旅行:
- /用户/Ben/图片/位置/pic1.jpg
长途旅行:
/用户/Ben/图片/行程名称/地点1/pic1.jpg
/用户/Ben/图片/行程名称/地点2/pic1.jpg
大多数文件夹都包含一个名为“最佳”的子文件夹,我从父文件夹中复制了我最喜欢的照片,从而复制了每张照片。
例如
短途旅行:
- /用户/Ben/图片/位置/最佳
长途旅行:
/用户/Ben/图片/旅行名称/地点1/最佳
/用户/Ben/图片/旅行名称/地点2/最佳
注意:一些较小的专辑不包含这个“最佳”文件夹。
我想要做的是递归扫描每个文件夹以查找“最佳”文件夹。 如果找到,那么我想浏览此文件夹内的每个文件并从父文件夹中删除相应的项目。
例如父文件夹包含:
- /用户/Ben/图片/位置1/pic1.jpg
- /用户/Ben/图片/位置1/pic2.jpg
- /用户/Ben/图片/位置1/pic3.jpg
“最佳”文件夹包含
- /用户/Ben/图片/位置1/最佳/pic1.jpg
- /用户/Ben/图片/位置1/最佳/pic3.jpg
然后我想从父文件夹中删除 pic1 和 pic3 并只保留 pic2。
谢谢你的帮助。
答案1
现在你已经澄清了你的问题,我想我知道你需要什么:-
find /Users/Ben/Pictures/ -type d -name Best | \
while read -r d; \
do for f in "$d"/*; \
do cmp "$f" "${f%/Best/*}/${f##*/Best/}" && \
ln -sf "${f%/Best/*}/${f##*/Best/}" "$f"; \
done; \
done
其工作原理如下:-
- 用于
find
定位所有Best/
子目录。 - 对于找到的每个子目录,将其每个文件与父文件夹中的原始文件进行比较。
- 如果它们相同,则使用
Best/
父文件夹中文件的链接覆盖该文件。 - 如果您更喜欢硬链接,您可以使用
ln -f ...
(ln -sf ...
两者都可以满足您的目的)。 - 关键的解析元素是,它从路径末尾
${f%/Best/*}
删除(应该与 相同),以及,它将文件名与路径隔离(应该与 相同)。/Best/FileName
$d
${f##*/Best/}
${f##*/}
- 我通常不会写完整的脚本作为答案,但我看不出有任何简单的方法来指导您完成它的编写;请确保在使用它之前您理解它 -
echo
在关键命令前面添加ln
以确保它能够按照您的期望执行。
我已经在 Ubuntu 上测试过了,但是 OS/X 实现cmp
应该ln
可以使用相同的参数。
为了防止出现错误,请在开始之前备份目录。