1

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

/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 工作。谢谢你的帮助。

4

4 回答 4

3

试一试:

#!/bin/sh

seq=1
for f in $(find /Volumes/library/Originals -name *.jpg)
do
    base=$(basename "$f" .jpg)
    new=$(printf "%s%03d.jpg" "$base" $seq)
    ln -fs "$file" "/image-links/$new"
    seq=$(expr $seq + 1)
done
于 2012-08-06T14:00:03.640 回答
1
PREFIX="filename"
SOURCEDIR="/Volumes/library/Originals"
DESTDIR="image-links"

i=0
cd $DESTDIR
find "$SOURCEDIR" -name \*.jpg | while read f
do
  ln -s "$f" $PREFIX$i.jpg
  i=$((i+1))
done
于 2012-08-06T14:04:14.977 回答
1

这个 oneliner 在 linux 上运行得很好。

find /Volumes/library/Originals -name "*.jpg" |
    awk '{print "ln -s \""$0"\" /image-links/filename_"FNR".jpg"}' | sh

解释管道

首先查找文件 | 第二个命令 |第三个运行命令

非常简单,经过测试并在 cron 中工作。

彼得

于 2012-08-06T14:37:04.510 回答
0

假设文件的深度相同,这样的 for 循环应该可以:

i=1
for file in /Volumes/library/Originals/*/*/*.jpg; do
    base=${file##*/}
    ln -s "$file" "/image-links/${base%.*}$((i++)).jpg"
done

您可以将目录名称添加到链接名称中,而不是给链接一个递增的数字。

for file in /Volumes/library/Originals/*/*/*.jpg; do
    base=${file##*/}
    dir=${file%/*} dir=${dir##*/}
    ln -s "$file" "/image-links/$dir $base"
done
于 2012-08-06T15:42:52.840 回答