我有一个很大的无人看的电影库,有时当我终于有时间看一眼时,很难选择一个。所以今天为了摆脱选择的痛苦,我决定写一个剧本。一个小时后(我是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
所以有很多子目录
答案 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允许不匹配任何文件的模式(请参阅路径名扩展)扩展为空字符串,而不是自己。