【问题标题】:Create symlink of every file in a folder tree [duplicate]创建文件夹树中每个文件的符号链接[重复]
【发布时间】:2018-08-30 04:46:17
【问题描述】:

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

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

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

【问题讨论】:

  • 使用 find 创建一个 mp3 列表并循环遍历该列表。
  • @LjmDullaart 你能帮我详细说明一下吗?这对我有很大帮助。
  • 你能告诉我们你到目前为止做了什么吗?

标签: linux bash symlink


【解决方案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

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

【讨论】:

  • 非常感谢!我一回到家就开始。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
相关资源
最近更新 更多