Search code examples
shellimage-processing

How do I check if all files inside directories are valid jpegs (Linux, sh script needed)?


Ok, I got a directory (for instance, named '/photos') in which there are different directories (like '/photos/wedding', '/photos/birthday', '/photos/graduation', etc...) which have .jpg files in them. Unfortunately, some of jpeg files are broken. I need to find a way how to determine, which files are broken. I found out, that there is tool named imagemagic, which can help a lot. If you use it like this:

identify -format '%f' whatever.jpg

it prints the name of the file only if file is valid, if it is not it prints something like "identify: Not a JPEG file: starts with 0x69 0x75 `whatever.jpg' @ jpeg.c/EmitMessage/232.". So the correct solution should be find all files ending with ".jpg", apply to them "identify", and if the result is just the name of the file - don't do anything, and if the result is different from the name of the file - then save the name of the file somethere (like in a file "errors.txt").

Any ideas how I can probably do that?


Solution

  • You can put this into bash script file or run directly:

    find -name "*.jpg" -type f |xargs --no-run-if-empty identify -format '%f' 1>ok.txt 2>errors.txt

    In case identify is missing, here is how to install it in Ubuntu: sudo apt install imagemagick --no-install-recommends