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


12

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

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

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

Answers:


14

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

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

这将以/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'

您的第一个命令将提取许多其他文件(视频除外)。例如,输出的一行是:/home/ravbholua/Downloads/Music_Command_line/[SOLVED] a code question regarding music file extensions_files/avatar774785_6.gif: image/jpeg; charset=binary 另一行输出是:/home/ravbholua/Free Computer Networking Books Download | Ebooks Online Textbooks.html: text/html; charset=iso-8859-1 我只需要将在vlc Player中运行的视频文件,等等
Ravi 2013年

@Ravi我不小心遗漏了sed排除不匹配的行的选项(以及file不打错行的选项),请参见我的编辑。
吉尔斯(Gilles)'所以

是的,吉尔斯,这就是我想要的。那很棒!运行您的命令后,我知道我的系统中有很多我不知道的视频(有些完整,有些不完整)。谢谢。
拉维

1
如果您的视频文件没有可预测的扩展名,那么这是理想的解决方案。诉诸于是file唯一的选择。
miguelg

13

按文件名搜索

正如克里斯在回答中提到的,您可以使用它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

按文件类型搜索

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

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

  • .mp4:ISO媒体,MPEG v4系统,版本1
  • .mkv:EBML文件,创建者matroska
  • .wmv:Microsoft 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"

另外,您可以使用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”.

使我们上面所做的事情适应这样的事情:

$ find /home/<user> -type f -exec file -i {} + | grep video

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

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

+1,当然,这不仅假定locate已安装,而且已建立数据库。
克里斯·唐纳

是的,大多数发行版通常都会每晚建立数据库,因此,直到每夜工作运行并添加它们之后,最近添加的文件才会存储在数据库中。
slm

1
您忘记了最常见的一种avi
Faheem Mitha 2013年

6

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

find ~ -type f -exec file -i {} + | grep video 

如果您可以按文件名进行搜索,那么假设该文件名具有通用的视频扩展名,并且位于您的主目录中:

find ~ -type f -name '*.mkv' -o -name '*.mp4' -o -name '*.wmv' -o -name '*.flv' -o -name '*.webm' -o -name '*.mov'

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

find ~ -type f -regex '.*\.\(mkv\|mp4\|wmv\|flv\|webm\|mov\)'

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


1
您还可以显示所有大于某个阈值的文件(假设视频文件很大)...
ChuckCottrill 2013年

克里斯·唐纳(Chris Down),这种使用文件名的方式行不通。我已经编辑了我的问题。请看一看
拉维

@Ravi请参阅我更新的答案,该答案使用了mimetypes。
克里斯·

您的第一个命令甚至会提取许多其他文件(视频除外)。例如,输出的一行是:输出的/home/ravbholua/Downloads/Music_Command_line/Any s_w to cut_add audio files, convert video to audio?_files/post_old.gif: image/gif; charset=binary 另一行是:/home/ravbholua/Downloads/Music_Command_line/command line - how to start a video from the terminal? - Ask Ubuntu.html: text/html; charset=utf-8 这没有解决我的目的。
拉维
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.