Bash脚本,用于运行当前目录或其子目录中包含的少量指定扩展名的随机文件

时间:2016-03-05 12:36:00

标签: bash ubuntu

我有一个很大的无人看的电影库,有时当我终于有时间看一眼时,很难选择一个。所以今天为了摆脱选择的痛苦,我决定写一个剧本。一个小时后(我是bash的新手)我终于解决了问题。这是:

#fill array with relative paths to files
while IFS=  read -r -d $'\0'; do
    list+=("$REPLY")
done < <(find . -type f -iname '*.mkv' -or -print0 -iname '*.mp4' -print0 -or -iname '*.avi' -print0)

#get files number and generate random namber
numberOfFiles=${#list[@]}
randNumber=$[ 1 + $[ RANDOM % $numberOfFiles ]]

#use random number to get random file path
relativeFilePath=${list[$randNumber]}

#get rid of dot in the beginning
relativeFilePath="${relativeFilePath:1:${#relativeFilePath}-1}"

#get current dir and merge it with relative file path
filePath=${PWD}$relativeFilePath

#execute file in vlc player
vlc "$filePath"

问题是:如何简化代码或以其他方式做同样的事情?就个人而言,我不喜欢这里如何使用文件扩展名并以绝对路径为vlc提供信息。

编辑: 假设我们有下一个文件结构:

./horror/movie1.mkv
./horror/movie2.avi
./documentary/bbc/geography/asia/movie3.mkv
./sci-fi/x-man/movie4.mp4

所以有很多子目录

2 个答案:

答案 0 :(得分:2)

以下内容将使用vlc从当前目录(或子目录)打开一个随机文件(我们假设您的视频集中没有非视频文件):

vlc $(find -type f | shuf | head -n 1)

如果你有非视频文件,我们会更聪明一些:

vlc $(find -type f -iname '*.mp4' -o -iname '*.mkv' | shuf | head -n 1)

(您可以看到如何添加更多扩展程序)

答案 1 :(得分:1)

使用GNU bash 4:

#!/bin/bash

shopt -s globstar nullglob
array=( **/*.{mkv,mp3} )
file="${array[${RANDOM}%${#array[@]}]}"
vlc "$file"

来自man bash

  

globstar:如果设置,路径名扩展上下文中使用的模式**将匹配所有文件以及零个或多个目录和子目录。如果模式后跟一个/,则只有目录和子目录匹配。

     

nullglob:如果设置,bash允许不匹配任何文件的模式(请参阅路径名扩展)扩展为空字符串,而不是自己。