我的计算机中到处都是图像文件,因此我想编写一个脚本,接收目录的完整路径作为输入,显示每个子目录中图像 (.jpg、.jpeg) 文件的总大小,并将所有收集到的大小相加并显示总和。有什么想法吗?
答案1
下面的做法并不完美。它不能很好地处理带有空格的目录,但除非您有大量带有相同后缀的头文件目录,否则这并不是什么问题。
find -type f -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' -o -iname '*.gif' -printf '%h %s\n' \
| awk -F '[ /]' '{a[$2] += $NF} END{for(i in a){print i, a[i]}}'
答案2
绝对更详细,一个python选项:
#!/usr/bin/env python3
import subprocess
import os
#---------------------------
directory = '/path/to/images'
m_subject = 'image'
#---------------------------
def get(command):
return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")
total_size = []
for root, dirs, files in os.walk(directory):
for file in files:
file = '"'+root+'/'+file+'"'
mtype = get('file --mime-type '+file).strip().split(' ')[-1]
if m_subject in mtype:
size = get("du -hk "+file).split()[0]; total_size.append(int(size))
print(file.strip('"')+"\n", mtype+"\n", size+" k\n")
print("-"*30, "\nnumber of files: "+str(len(total_size)), "\ntotal size: "+str(sum(total_size))+" k")
try:
print("average size: "+str(int(sum(total_size)/len(total_size)))+" k")
except ZeroDivisionError:
pass
它以递归方式列出里面的所有图像文件directory
,最后给出每个文件的大小和总大小:
..................
/path/to/image3828.JPG
image/jpeg
1024 k
/path/to/image3829.JPG
image/jpeg
1024 k
/path/to/image3830.JPG
image/jpeg
1024 k
------------------------------
number of files: 3830
total size: 4248576 k
average size: 1109 k
如何使用:
- 将脚本复制到空文件中
- 在脚本的头部部分,设置您想要搜索的类型(
m_subject =
)和目录( )。directory =
- 另存为
list_image.py
通过命令运行:
python3 /path/to/list_image.py
精炼结果
您可以通过将值更改m_subject =
为image/jpeg
或image/png
来进一步限制找到的结果。
编辑:排序选项
您没有要求,但是现在我们有了脚本,如果不添加更多(排序)选项以便更好地了解目录内图像的出现情况,那将非常遗憾。
以下版本添加了按以下方式排序的选项“大小”、“名称”、“目录”或者“类型”. 按“大小”排序,得到如下输出:
.........
image_09.jpg image/jpeg 956 k /path/to/image_1.jpg
image_10.jpg image/jpeg 1044 k /path/to/image_2.jpg
image_11.jpg image/jpeg 1072 k /path/to/image_3.jpg
image_12.jpg image/jpeg 1108 k /path/to/image_4.jpg
image_13.jpg image/jpeg 1180 k /path/to/image_5.jpg
image_14.jpg image/jpeg 1720 k /path/to/image_6.jpg
image_15.jpg image/jpeg 1832 k /path/to/image_7.jpg
------------------------------
number of files: 15
total size: 13160 k
average size: 877 k
剧本
- 按照第一个选项的说明使用它。
#!/usr/bin/env python3
import subprocess
import os
#---------------------------
directory = '/path/to/images'
m_subject = 'image'
sort = "size" # options are: "size", "name", "directory", "type"
#---------------------------
def get(command):
return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")
total_size = []
images = []
# gathering information on the images
for root, dirs, files in os.walk(directory):
for file in files:
file_dr = '"'+root+'/'+file+'"'
mtype = get('file --mime-type '+file_dr).strip().split(' ')[-1]
if m_subject in mtype:
size = get("du -hk "+file_dr).split()[0]; total_size.append(int(size))
images.append([file, mtype, int(size), file_dr.replace('"', "")])
# sorting options
if sort == "name":
images.sort(key=lambda x: x[0])
elif sort == "type":
images.sort(key=lambda x: x[1])
elif sort == "size":
images.sort(key=lambda x: x[2])
elif sort == "directory":
images.sort(key=lambda x: x[3])
for image in images:
image[2] = str(image[2])+" k"
# print info per image
print(("\t").join(image))
#print summary
print("-"*30, "\nnumber of files: "+str(len(total_size)), "\ntotal size: "+str(sum(total_size))+" k")
try:
print("average size: "+str(int(sum(total_size)/len(total_size)))+" k")
except ZeroDivisionError:
pass