随机选择具有给定扩展名的文件并将其复制到给定目录

时间:2017-08-31 15:14:12

标签: bash

我想编写一个简单的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进行递归搜索。

2 个答案:

答案 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