linux - 为文件夹树中的每个文件创建符号链接(symbolic link)

标签 linux bash symlink

我需要一个 Bash 脚本来为每个 *.mp3 创建一个符号链接(symbolic link)文件位于文件夹 X(及其子文件夹)中,并将这些符号链接(symbolic link)存储在文件夹 Y 中,没有子文件夹,并且可能会跳过重复项。

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

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

最佳答案

如评论中所述:使用 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

这应该会给你一个相当好的结果。它还为您提供了一个良好的起点。

关于linux - 为文件夹树中的每个文件创建符号链接(symbolic link),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49399994/

相关文章:

linux - 记录终端的命令不适用于 bash

linux - 当路径包含符号链接(symbolic link)时,如何在 unix/linux 中移回一个目录?

linux - 如果在 perl 脚本中运行 cp 是否会覆盖存在的文件?

linux - 如何打印由 sed/awk 更改的行号

c++ - 在 Linux 上的 Visual Studio 中链接两个项目

linux -/proc/net/dev 中字段的含义是什么?

linux - 根据自己的大小查找最胖的目录

linux - 将文件大小从 MB 转换为字节并使用 Bash 进行比较

svn - 内部svn :externals怎么办

symlink - 如果循环符号链接(symbolic link)没有用,那么为什么允许它们呢?