Сценарий для нахождения размера файлов изображений

У меня есть файлы изображений, рассеянные все вокруг моего компьютера, таким образом, я хотел бы записать сценарий, который получает, как введено полный путь к каталогу, отобразите общий размер изображения (.jpg, .jpeg) файлы в каждом из подкаталогов и подведите итог всех собранных размеров и отобразите сумму также. Какие-либо идеи?

0
задан 17 January 2015 в 02:34

2 ответа

Следующее не прекрасно. Это не обрабатывает каталоги с пробелами хорошо, но если у Вас нет загрузки каталогов заголовка с идентичными суффиксами, это не действительно проблема.

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]}}'
1
ответ дан 6 October 2019 в 04:13

Определенно более подробный, опция 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
1
ответ дан 6 October 2019 в 04:13

Другие вопросы по тегам:

Похожие вопросы: