【问题标题】:Using Bash find to identify files whose folder contains a desired word使用 Bash find 来识别文件夹中包含所需单词的文件
【发布时间】:2016-02-18 22:10:54
【问题描述】:

我编写了一个非常简单的 bash 程序来查找具有给定名称的视频文件并在 VLC 中播放它们。

这很好用,但我似乎无法弄清楚如何使 find 命令也检查包含文件夹的名称。

这是一个问题,因为我经常看那些在描述性命名文件夹中的系列,但其文件名通常是“episode 1”、“episode 2”等。

我不能简单地搜索文件夹本身,因为文件夹可能包含 VLC 无法处理的其他格式的文件。

我当前的代码如下:

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   

任何帮助将不胜感激!

【问题讨论】:

    标签: bash file shell video vlc


    【解决方案1】:

    -iwholename 可能是您正在寻找的选项。 -iname 只对文件名进行操作,-iwholename 对……嗯……整个名称(路径)进行操作。 ;-)

    添加更多“寻找香料”后,您最终可能会出现:

    find . -type f \
           -iwholename "*$partOfNameToFind*" \
           \( -name "*.mp4" \
           -o -name "*.flv" \
           -o -name "*.wav" \
           -o -name "*.wmv" \
           \) \
           -exec vlc --nointeract {} +
    

    请注意,以上内容将匹配任一文件或目录名称中的$partOfNameToFind。

    find ... -exec {} 可以正确处理任何文件名,包括空格、全局字符、换行符等。尾随的+ 将多次命中作为一行参数;如果您的查询匹配 lots 的文件(例如,一个比 shell 可以处理的列表更长的列表),这将在 multiple 的 vlc 调用中被分解。

    尾随 \; 将改为对每个找到的文件进行一次 vlc --nointeract 调用。

    话虽如此,我一直认为man find 是一个真正的宝库。 ;-)

    【讨论】:

    • 使用find ... -exec vlc --nointeract {} + 更安全,因为如果文件名包含空格或全局字符,您的方法将中断。
    • @TomFenech:printf 确实将文件名括在引号中,因此空格是安全的。是的,您的方法仍然更安全(尽管文件名中包含 glob 字符的任何人 值得 任何可能带来的问题) - 但我想保持 有点 接近 OP 的原始.将您的变体添加到答案中。
    • @glennjackman: sigh ...这就是您“快速”回答“简单”问题所得到的结果,主要是您在 OP 的问题中找到的内容和假设他所说的“有效”,实际上有效...
    • 从种子下载的文件通常在文件名中有[]...例如the.great.movie.[720p].mp4... 叹息!我确实倾向于在下载后重命名它们,但如果它们是从某人那里批量复制的,那么通常会错过这一步。
    猜你喜欢
    • 2021-04-20
    • 2014-01-18
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    相关资源
    最近更新 更多