В этой небольшой заметке мы хотели бы показать, как в Bash обнаружить файлы PNG, JPG или GIF, когда мы не знаем расширения файла - этот вид обнаружения использует магические числа, расположенные внутри файла).
Быстрые решения (используйте следующие команды):
1. Проверка файла JPEG:
1 | [ "$(xxd -s 6 -l 4 -p "/path/to/image.jpg")" = "4a464946" ] && echo "is JPEG" || echo "is not JPEG" |
2. Тест PNG-файла:
1 | [ "$(xxd -s 1 -l 3 -p "/path/to/image.png")" = "504e47" ] && echo "is PNG" || echo "is not PNG" |
3. Тест файла GIF:
1 | [ "$(xxd -s 0 -l 3 -p "/path/to/image.gif")" = "474946" ] && echo "is GIF" || echo "is not GIF" |
Практический пример
Пример содержания файла detect_image_type.sh:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #!/bin/bash function is_jpg() # args: file_path { # J F I F (as chars) # 4a464946 (in hex) [ "$(xxd -s 6 -l 4 -p "$1")" = "4a464946" ] && return 0 || return 1 } function is_png() # args: file_path { # P N G (as chars) # 504e47 (in hex) [ "$(xxd -s 1 -l 3 -p "$1")" = "504e47" ] && return 0 || return 1 } function is_gif() # args: file_path { # G I F (as chars) # 474946 (in hex) [ "$(xxd -s 0 -l 3 -p "$1")" = "474946" ] && return 0 || return 1 } # Usage example: echo -e "\n--------------------------------\nJPG files:\n"; for file_name in *.* do is_jpg "$file_name" && echo "$file_name" done echo -e "\n--------------------------------\nPNG files:\n"; for file_name in *.* do is_png "$file_name" && echo "$file_name" done echo -e "\n--------------------------------\nGIF files:\n"; for file_name in *.* do is_gif "$file_name" && echo "$file_name" done echo -e "\n--------------------------------\n" echo -e "DONE!\n" |
Запуск
1 | ./detect_image_type.sh |
Пример вывода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | -------------------------------- JPG files: picture.jpg mountains.jpeg river.tmp sun.tmp -------------------------------- PNG files: ball.png square.unknown -------------------------------- GIF files: animation.dat -------------------------------- DONE! |