我想编写一个简单的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进行递归搜索。
发布于 2017-08-31 15:21:27
您可以将所有文件推入数组中,然后在随机索引下选择一个来移动。这需要启用 option,以便您可以使用**/* glob模式:
shopt -s globstar
flacfiles=(/music/**/*.flac)
cp "${flacfiles[RANDOM % ${#flacfiles[@]}]}" /test/random.flac为了选择一个随机索引,我们采用$RANDOM模块化flacfiles数组中的元素数。
如果您想要一条错误消息,以防glob与任何内容不匹配,您可以使用failglob shell选项:
shopt -s globstar failglob
if flacfiles=(/music/**/*.flac); then
cp "${flacfiles[RANDOM % ${#flacfiles[@]}]}" /test/random.flac
fi如果出现错误消息,这将失败。
-bash: no match: music/**/*.flac如果没有匹配的文件,也不会试图复制任何内容。
如果您确信存在.flac文件,则可以忽略这一点。
发布于 2017-08-31 15:21:56
复电
使用find而不是ls
find /music/ -iname '*.flac' -print0 | shuf -z -n1find部件将找到目录/music/中的所有flac文件,并列出它们。
shuf对该列表进行洗牌,并打印第一个条目(这是随机的,因为列表被洗牌了)。
-print0和-z可以使用\NUL来分隔文件名。如果没有这些选项,就会使用\n (newline),这是不安全的,因为文件名可以包含换行符(尽管它非常少见)。
复制
如果您只想复制一个随机文件,则不需要使用while循环。使用替代$()代替。
cp "$(find /music/ -iname '*.flac' -print0 | shuf -z -n1)" /test/random.flachttps://stackoverflow.com/questions/45984852
复制相似问题