我需要一个 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/