使用Bash find识别文件夹中包含所需单词的文件
我已经编写了一个非常简单的bash程序来查找具有给定名称的视频文件并在VLC中播放它们 这已经足够好了,但我似乎不知道如何使find命令也检查包含文件夹的名称 这是一个问题,因为我经常看一些系列节目,这些节目在命名为描述性文件夹中,但其文件名通常是“第1集”、“第2集”等 我不能简单地搜索文件夹本身,因为文件夹可能包含VLC无法处理的其他格式的文件 我的当前代码如下所示:使用Bash find识别文件夹中包含所需单词的文件,bash,file,shell,video,vlc,Bash,File,Shell,Video,Vlc,我已经编写了一个非常简单的bash程序来查找具有给定名称的视频文件并在VLC中播放它们 这已经足够好了,但我似乎不知道如何使find命令也检查包含文件夹的名称 这是一个问题,因为我经常看一些系列节目,这些节目在命名为描述性文件夹中,但其文件名通常是“第1集”、“第2集”等 我不能简单地搜索文件夹本身,因为文件夹可能包含VLC无法处理的其他格式的文件 我的当前代码如下所示: A=$(find -iname "*$partOfNameToFind*" -exec echo -n '"{}" ' \
A=$(find -iname "*$partOfNameToFind*" -exec echo -n '"{}" ' \; | grep -e mp4 -e flv -e wav -e wmv | sed -e 's/\.\///g' | tr '\n' ' ')
eval vlc --nointeract $A
任何帮助都将不胜感激
-iwholename
可能是您正在寻找的选项。虽然-iname
仅对文件名起作用,-iwholename
对。。。好。。。全名(路径)。;-)
再加上一些“寻找香料”,你最终可能会发现:
find . -type f \
-iwholename "*$partOfNameToFind*" \
\( -name "*.mp4" \
-o -name "*.flv" \
-o -name "*.wav" \
-o -name "*.wmv" \
\) \
-exec vlc --nointeract {} +
请注意,以上内容将在文件名或目录名中匹配$partOfNameToFind
查找-exec{}
正确地处理任何文件名,包括空格、全局字符、换行符等。尾随的+
作为一行参数给出多个点击;如果您的查询匹配大量文件(例如,一个比shell可以处理的长度更长的列表),那么这将在多次调用vlc
时被分解
尾随的\
会为找到的每个文件调用一次vlc--nointeract
尽管如此,我总是发现人类是一个真正的宝藏 使用
查找更安全-exec vlc--nointeract{}+
,因为如果文件名包含空格或全局字符,您的方法将中断。@TomFenech:printf会将文件名括在引号中,因此空格是安全的。是的,您的方法更安全(尽管任何文件名中有glob字符的人都应该得到任何可能带来的问题)——但我希望与OP的原始方法保持一定的距离。将你的变体添加到答案中。@glennjackman:叹气。。。这就是你通过“快速”回答一个“简单”的问题所得到的,主要是你在OP的问题中找到的,并且假设他说的“有效”,实际上有效…从torrents下载的文件通常在文件名中有[]
。。。e、 g.the.great.movie[720p].mp4
。。。唉!我确实倾向于在下载后重命名它们,但如果它们是从某人那里批量复制的,那么这一步通常会错过。