将目录树中的所有 JPG 符号链接到单个目录

将目录树中的所有 JPG 符号链接到单个目录

我有一系列目录和其中包含的图像:

/Volumes/library/Originals/2012/2012-05-13 Event/filename.jpg
/Volumes/library/Originals/2011/2011-03-11 Event/filename.jpg
/Volumes/library/Originals/2011/2011-01-12 Event/filename.jpg
/Volumes/library/Originals/2009/2019-07-11 Event/filename.jpg

使用 bash,如何在单个目录中创建指向该目录树的符号链接?

/image-links/filename.jpg
/image-links/filename1.jpg

我需要这个来让我的照片屏幕保护程序在不支持递归目录的 Mac OS X 10.8 上运行。我想我可以创建一个 cron 作业,每晚执行此操作。感谢您的帮助。

答案1

这个怎么样:

IFS=
no=1
for file in `find /Volumes/library/Originals -type f -name '*.jpg'`; do
  prefix=`basename $file .jpg`
  ln -s $file /image-links/$prefix$no.jpg
  no=$(($no + 1))
done

快速提示:您必须取消设置 IFS 变量,因为 MacOS X 喜欢目录和文件名中的空格。将 IFS 设置为 nil 可防止“for”循环在空格所在的位置分解“find”传递的文件名。当然,有关 IFS 的更多信息,请参阅 bash 的手册页。

快速说明 2:我有一个从 1 开始的计数器“no”,用于区分具有相同源名称的文件。for 循环遍历“find”的结果,该结果收集 /Volumes/library/Originals 下以 .jpg 结尾的所有文件。每个以“/Volumes/library/Originals/something/something else/etc./<filename>.jpg”结尾的文件随后被符号链接为“/image-links/<filename><no>.jpg”。'basename' 从其目录中删除完整路径和 .jpg 后缀。

答案2

我认为这里的做法是错误的。您希望共享 iPhoto 中的照片以用作桌面屏幕保护程序的来源。

做到这一点的方法干净地是创建您想要使用的图像的相册。它也可以是一个“智能相册”,它使用基本逻辑来确定其内容。

在此处输入图片描述

然后,在桌面和屏幕保护程序偏好设置窗格中,选择 iPhoto 作为数据源。如果您在选择 iPhoto 时遇到任何问题,您可能需要清除与这些偏好设置关联的 .plist 文件(山狮问题)。

在此处输入图片描述

答案3

您必须添加逻辑来处理重复的名称,但您可以从 find 的一个非常基本的用法开始,例如 find ./ -name *jpg -execdir /tmp -exec /bin/ln -s '{}' \; 从您希望链接出现的目录执行。

相关内容