我有一个媒体服务器,其文件托管在一组联网硬盘上(所有文件都在符号链接中,以便我的 dlna 服务器可以捕获它们)
我怎样才能将ln -s
所有“cover.jpg”符号链接()到封面所在的同一目录,但作为名为 poster.jpg 的链接,指向位于其中的所有嵌套文件夹/mnt/1TB2/TV/
?
我确实尝试过此代码,它将使用此行列出所有内容
find -L /mnt/1TB2/TV/* -name 'cover.jpg'
它最终列出了所有这些,但不允许我在这样的 Bash 脚本中使用它:
#!/bin/bash
for file in $(find -L /mnt/1TB2/TV/* -name 'cover.jpg')
do
ln -s $file poster.jpg
done
然而,我并不是最擅长编写 bash 脚本的人(实际上经验很少甚至没有经验)我认为这与文件夹名称中的空格有关,但我不确定。
笔记: 此驱动器中有很多文件和文件夹,但主图如下
=TV SHOW NAME (CONTAINING SPACES)
=-cover.jpg
=-trailer.mov
=-SEASON 00
=-+cover.jpg
=-+TV SHOW - 0X01 - EPISODE NAME.MKV
=-SEASON 01
=-+cover.jpg
=-+TV SHOW - 1X01 - EPISODE NAME.MKV
答案1
我想你想要这个:
find -L /mnt/1TB2/TV/* -name cover.jpg -execdir ln -s cover.jpg poster.jpg \;
-execdir
移动到文件目录,并执行ln -s cover.jpg poster.jpg
。
您的脚本有两个主要问题:
for file in $(find -L /mnt/1TB2/TV/* -name 'cover.jpg')
这将在空格处断开。例如,包含的文件路径
SEASON 01
将在空格处被拆分。通常最好避免在 shell 脚本中处理文件名,而是使用
find -exec
或find -execdir
。但如果你真的需要,我知道最彻底的方法是while IFS= read -rd '' filename; do ... done < <(find ... -print0)
... 真是一口气。
ln -s $file poster.jpg
由于目录没有变化,因此将在运行脚本的目录中创建符号链接。
这也将
$file
在空格处进行拆分。您应该始终引用变量:"$file"