我是 Bash 脚本的初学者。我最近一直在为学校项目编写一个脚本来强化 Ubuntu 计算机。一切进展顺利,只是不允许学生使用任何媒体文件(.mp3、.mov 等),而我不确定该怎么做。我会使用什么命令?grep?我已经研究了几个小时,但毫无收获。这不需要花很长时间。我需要的只是一个示例,我可以将其复制为不同的扩展名。我需要它能够执行以下操作:
- 查找媒体文件
- 将文件路径发送到文本文件
- 通知找到的媒体文件数量
例如,我希望它输出如下内容:
Searching for media files... 5 media files found! Details can be found in 'media.txt'
任何帮助是极大的赞赏!
答案1
要查找特定类型的文件,我不会搜索文件扩展名。我宁愿使用 和 的组合来扫描文件的 MIME 类型find
。file
然后可以grep
针对所需的 mimetypes(例如audio/*
和 )编辑此输出video/*
。
我创建了一个小脚本来实现这一点:
#!/usr/bin/env bash
#Don't know whether you want to do so, but this deletes a existing media.txt
rm media.txt
#Find files of desired MIME types and store them in $list
list=$(find | file -if - | grep -P "(audio/.*?;)|(video/.*?;)")
n=0
#Iterate over each line in the list (one file per line)
while read -r line; do
#Append the filename to media.txt
echo "$line" | cut -f1 >> media.txt
#Increase file counter
n=$(($n+1))
done <<< "$list"
#Output the result
echo "$n media files found! Saved to media.txt"
请注意,我使用完整的 RegExp 和 grep。要添加一些 MIME 类型,请按照我对已包含的两个类型所做的方式构建它们:(type/enc;)
然后使用 RegExp OR ( |
) 添加它们。
PS:脚本在当前目录中运行。如果想使其更灵活,请在以下管道之间添加一个$1
。find
现在运行脚本并将要搜索的路径作为参数。
答案2
绝对是一个更详细的选项(python),它使用命令查找 mimetype file
。它是这个,适合您的目的。
它能做什么
当找到文件时
它返回一条消息(在终端中):
checking for filetypes: image, video, audio...
4 media files found. See for details: /home/jacob/Bureaublad/found.txt
当文本文件写入你在脚本头部定义的目录/名称时
或者,如果没有找到:
checking for filetypes: image, video, audio...
no files found
如何使用
将下面的脚本复制到一个空文件中,编辑脚本头部部分的三行:
source_dir = "/path/to/directory"
filetypes = ("image", "video", "audio") # you might want to leave this line as it is, used by the file command
report = "/path/to/report.txt"
将其保存为find_media.py
,并通过命令在终端窗口中运行它:
python3 /path/to/find_media.py
剧本:
#!/usr/bin/env python3
import os
import subprocess
# ---
source_dir = "/path/to/directory"
filetypes = ("image", "video", "audio")
report = "/path/to/report.txt"
# ---
print("checking for filetypes: "+(", ").join(filetypes)+"."*3)
found = []
def look_for():
for root, dirs, files in os.walk(source_dir):
for name in files:
file = root+"/"+name
ftype = subprocess.check_output(
['file', '--mime-type', '-b', file]
).decode('utf-8').strip()
if ftype.split("/")[0] in filetypes:
found.append(file)
found_files = len(found)
if found_files != 0:
print(str(found_files), "media files found. See for details: ", report)
with open(report, "wt") as out:
for item in found:
out.write(item+"\n")
else:
print("no files found")
look_for()