我想编写一个简单的bash脚本,从.flac
文件夹中随机选择一个/music/
文件(由于该文件夹中有很多子文件夹,它必须是递归的),然后复制归档到/test/random.flac
This post非常接近我想要做的但我不确定如何更改脚本以执行我想要的操作。
我试过了:
ls /music |sort -R |tail -1 |while read file; do
cp $file /test/random.flac
done
但是我错过了如何告诉ls
对子文件夹中的所有.flac
进行递归搜索。
答案 0 :(得分:3)
您可以将所有文件推送到数组中,然后在随机索引中选择一个以移动。这需要启用globstar
option,以便您可以使用BluetoothGatt
glob模式:
**/*
要选择随机索引,我们将$RANDOM
模数为shopt -s globstar
flacfiles=(/music/**/*.flac)
cp "${flacfiles[RANDOM % ${#flacfiles[@]}]}" /test/random.flac
数组中的元素数。
如果你想要一个错误消息,以防万一没有匹配,你可以使用flacfiles
shell选项:
failglob
此操作失败并显示错误消息
shopt -s globstar failglob
if flacfiles=(/music/**/*.flac); then
cp "${flacfiles[RANDOM % ${#flacfiles[@]}]}" /test/random.flac
fi
如果没有匹配的文件,并且不尝试复制任何内容。
如果您确定有-bash: no match: music/**/*.flac
个文件,则可以忽略此信息。
答案 1 :(得分:3)
使用find
代替ls
:
find /music/ -iname '*.flac' -print0 | shuf -z -n1
find
部分将在目录/music/
中找到所有flac文件并列出它们
shuf
随机播放列表并打印第一个条目(这是随机的,因为列表已被洗牌)。
-print0
和-z
可以使用\NUL
来分隔文件名。如果没有这些选项,将使用\n
(换行符),这是不安全的,因为文件名可以包含换行符(即使它非常罕见)。
如果您只想复制一个随机文件,则不需要while
循环。请改用替代$()
。
cp "$(find /music/ -iname '*.flac' -print0 | shuf -z -n1)" /test/random.flac