象征性地将目录树中的所有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工作。谢谢你的帮助。

破解:

#!/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
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

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

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

解释管道

第一个查找文件|第二个生成命令|第三个运行命令

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

Petr

假设文件的深度相同,则应该使用这样的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

最新更新