如何在 Ubuntu 上搜索视频文件?

Rav*_*avi 12 file-search

几个月前我下载了一个视频。我不太记得保存它的名称。是否有任何命令或任何方法只输出视频文件,以便我可以在那里搜索我的视频?从手册页,我找不到找到做这项工作的任何选项。

我下载的视频文件可能有任何扩展名(如 webm 等),而且可能我当时将名称更改为诸如“abcde”之类的名称,我现在不记得了。所以搜索不能基于文件名!

(仅提一个相似之处:在 perl 中有检查文件是文本文件还是二进制文件等的命令。类似地,可能有一种方法可以检查其视频文件还是多媒体文件)

Gil*_*il' 15

基本思想是使用文件实用程序来确定每个文件的类型,并对视频文件进行过滤。

find /some/directory -type f -exec file -N -i -- {} + |
sed -n 's!: video/[^:]*$!!p'
Run Code Online (Sandbox Code Playgroud)

这将/some/directory递归打印其MIME类型为视频类型的所有文件及其子目录的名称。

file命令需要打开每个文件,这可能很慢。为了加快速度:

  • 将命令限制在它可能位于的目录树中,例如/tmp/var/tmp以及您的主目录。
  • 将搜索限制为大小在正确范围内的文件,例如至少 10MB。
  • 将搜索限制为修改时间在正确范围内的文件。请注意,下载文件可能已将其修改时间设置为下载时间或保留时间,具体取决于您用于下载的程序(以及使用什么设置)。您还可以过滤 inode 更改时间 (ctime),即文件上次以任何方式修改或移动(创建、重命名等)的时间。

这是一个示例,该示例将修改时间限制为至少 60 天前,并将 ctime 限制为不超过 100 天前。

find /tmp /var/tmp ~ -type f -size +10M \
     -mtime +60 -ctime -100 \
     -exec file -N -i -- {} + |
sed -n 's!: video/[^:]*$!!p'
Run Code Online (Sandbox Code Playgroud)


slm*_*slm 12

按文件名搜索

正如克里斯在他的回答中提到的那样,您可以使用它find来执行此操作,但我发现搜索locate数据库的速度要快得多。

假设你的发行版提供了这个功能,大多数大发行版都提供了,Ubuntu、Fedora、CentOS 等。

例子

$ locate --basename .mp4 .mkv .wmv .flv .webm .mov .avi | head -5
/home/saml/Desktop/sample_mpeg4.mp4
/home/saml/Downloads/Karrolls_Christmas/Karroll's Christmas (2004) part 1.mp4
/home/saml/Downloads/Karrolls_Christmas/Karroll's Christmas (2004) part 10.mp4
/home/saml/Downloads/Karrolls_Christmas/Karroll's Christmas (2004) part 2.mp4
/home/saml/Downloads/Karrolls_Christmas/Karroll's Christmas (2004) part 3.mp4
Run Code Online (Sandbox Code Playgroud)

按文件类型搜索

要按类型查找文件,您可以使用该命令file获取有关特定文件类型的信息列表。

这是我的系统 Fedora 19 中这些文件类型的粗略列表。

  • .mp4:ISO 媒体,MPEG v4 系统,版本 1
  • .mkv:EBML 文件,创建者 matroska
  • .wmv:微软 ASF
  • .flv:Macromedia Flash 视频
  • .webm:WebM
  • .mov:ISO 媒体,Apple QuickTime 影片
  • .avi: AVI

您可以使用此命令查找/home/<user>目录中的所有文件。

$ find /home/<user> -type f -exec file {} + | \
    grep -E "MPEG v4|EBML|\
      Microsoft ASF|Macromedia Flash Video|WebM|Apple QuickTime movie|AVI"
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用file归类为“视频”的 mime 类型进行搜索。

 -i, --mime
         Causes the file command to output mime type strings rather than 
         the more traditional human readable ones.  Thus it may say 
         ‘text/plain; charset=us-ascii’ rather than “ASCII text”.
Run Code Online (Sandbox Code Playgroud)

将我们上面所做的调整为这样的:

$ find /home/<user> -type f -exec file -i {} + | grep video
Run Code Online (Sandbox Code Playgroud)

您可以使用sed仅获取文件名:

$ find /home/<user> -type f -exec file -i {} + |
    sed -n '/video/s/:[^:]\+$//p'
Run Code Online (Sandbox Code Playgroud)


Chr*_*own 7

由于您现在指定它不能基于扩展名,您还可以仔细阅读file(警告:这可能需要很长时间):

find ~ -type f -exec file -i {} + | grep video 
Run Code Online (Sandbox Code Playgroud)

如果您可以通过文件名进行搜索,假设它有一个通用的视频扩展名并且它在您的主目录中:

find ~ -type f -name '*.mkv' -o -name '*.mp4' -o -name '*.wmv' -o -name '*.flv' -o -name '*.webm' -o -name '*.mov'
Run Code Online (Sandbox Code Playgroud)

您还可以使用正则表达式:

find ~ -type f -regex '.*\.\(mkv\|mp4\|wmv\|flv\|webm\|mov\)'
Run Code Online (Sandbox Code Playgroud)

如果您对下载它的时间有一个好主意(并假设 mtime 设置为那个时间),您还可以尝试使用 GNU find 的-mtime选项缩小范围。