创建文件夹3中每个文件的符号链接

时间:2018-03-21 06:54:06

标签: linux bash symlink

我需要一个Bash脚本,它将为文件夹X(及其子文件夹)中的每个*.mp3文件创建一个符号链接,并将这些符号链接存储在文件夹Y中,不包含子文件夹,可能会跳过重复项。

好奇的是,这是使用Libretime自动化广播电台。

抱歉,如果这是一个愚蠢的问题,我从未使用过Bash脚本。

1 个答案:

答案 0 :(得分:1)

与评论一样:使用find创建mp3文件列表:

find /top/dir/for/mp3s -name '*mp3'

您将希望使用该输出循环它,所以:

find /top/dir/for/mp3s -name '*mp3' | while read mp3file, do
    # do the linking
done

您希望在特定目录中创建一个链接,可能具有相同的文件名。您可以使用basename获取文件名。所以,这将使它像这样:

find /top/dir/for/mp3s -name '*mp3' | while read mp3file; do
    filename=$(basename $mp3file)
    ln -s $mp3file /dir/where/the/links/are/$filename
    echo Linked $mp3file to /dir/where/the/links/are/$filename
done

但是,这可能会给你两种类型的错误:

  • 如果mp3文件名包含空格,basename将无法生成正确的文件名,ln会抱怨。解决方案:使用正确的引用。
  • 如果您有重复的文件名,ln会抱怨该链接已存在。解决方案:测试链接是否存在。

因为你没有摧毁任何东西,你可以尝试并实际看到问题。所以,我们的下一次迭代将是:

find /top/dir/for/mp3s -name '*mp3' | while read mp3file; do
    filename=$(basename "$mp3file")
    if [ ! -l "/dir/where/the/links/are/$filename" ] ; then
        ln -s "$mp3file" "/dir/where/the/links/are/$filename"
        echo "Linked $mp3file to /dir/where/the/links/are/$filename"
    else
        echo "Not linked $mp3file; link exists"
    fi
done

那会给你一个相当不错的结果。它也为您提供了一个很好的起点。