首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >随机选择具有给定扩展名的文件并将其复制到给定的目录中。

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

Stack Overflow用户
提问于 2017-08-31 15:14:11
回答 2查看 964关注 0票数 0

我想编写一个简单的bash脚本,它从.flac文件夹中随机选择一个/music/文件(它必须是递归的,因为该文件夹中有许多子文件夹),并将该文件复制到/test/random.flac

This post非常接近我想要做的事情,但我不知道如何更改脚本以实现我想做的事情。

我试过这个:

代码语言:javascript
复制
ls /music |sort -R |tail -1 |while read file; do
    cp $file /test/random.flac
done

但是,我不知道如何告诉ls对子文件夹中的所有.flac进行递归搜索。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-31 15:21:27

您可以将所有文件推入数组中,然后在随机索引下选择一个来移动。这需要启用 option,以便您可以使用**/* glob模式:

代码语言:javascript
复制
shopt -s globstar
flacfiles=(/music/**/*.flac)
cp "${flacfiles[RANDOM % ${#flacfiles[@]}]}" /test/random.flac

为了选择一个随机索引,我们采用$RANDOM模块化flacfiles数组中的元素数。

如果您想要一条错误消息,以防glob与任何内容不匹配,您可以使用failglob shell选项:

代码语言:javascript
复制
shopt -s globstar failglob
if flacfiles=(/music/**/*.flac); then
    cp "${flacfiles[RANDOM % ${#flacfiles[@]}]}" /test/random.flac
fi

如果出现错误消息,这将失败。

代码语言:javascript
复制
-bash: no match: music/**/*.flac

如果没有匹配的文件,也不会试图复制任何内容。

如果您确信存在.flac文件,则可以忽略这一点。

票数 3
EN

Stack Overflow用户

发布于 2017-08-31 15:21:56

复电

使用find而不是ls

代码语言:javascript
复制
find /music/ -iname '*.flac' -print0 | shuf -z -n1

find部件将找到目录/music/中的所有flac文件,并列出它们。

shuf对该列表进行洗牌,并打印第一个条目(这是随机的,因为列表被洗牌了)。

-print0-z可以使用\NUL来分隔文件名。如果没有这些选项,就会使用\n (newline),这是不安全的,因为文件名可以包含换行符(尽管它非常少见)。

复制

如果您只想复制一个随机文件,则不需要使用while循环。使用替代$()代替。

代码语言:javascript
复制
cp "$(find /music/ -iname '*.flac' -print0 | shuf -z -n1)" /test/random.flac
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45984852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档