2012-08-06 52 views
1

我有一系列的目录,以及其中包含的图像:象征性链接的所有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工作。谢谢你的帮助。

+2

请勿在不同的[SE]网站上交叉发布。如果问题出现在其他网站上,请举报,以便版主可以处理。 – 2012-08-06 14:11:16

+1

由于SF副本已关闭,因此我们将继续打开此副本,并在此处获得解答。今后请不要交叉邮件。 – 2012-08-06 14:23:46

回答

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 
+0

的解决方案是完美的! – 2012-08-06 15:42:46

+0

不知道我用“完美”,但+1同意对抗恕我直言误导-1。 – tripleee 2012-08-06 15:57:44

+0

@tripleee :thank you tripleee :) – 2012-08-06 17:01:50

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 
+0

我认为,该行应为“LN -fs‘$基地’......没有? – ensnare 2012-08-06 15:21:23

+0

添加'型F'到'find'命令行,以确保公正。 – 2012-08-06 15:40:13

+2

这会失败,在包含空格的路径。决不结合起来,并找见http://mywiki.wooledge.org/BashFAQ/020 – geirha 2012-08-06 15:45:10

1

这oneliner是工作在Linux上非常好。

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

要解释管道

首先找到文件|秒使命令|第三次运行命令

很简单,测试和在cron中工作。

切赫

+0

向不应该报告目录或任何其他特殊文件的任何'find'添加'-type f'是很好的。 – 2012-08-06 15:42:18

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