I need to find all image files from directory (gif, png, jpg, jpeg).
find /path/to/ -name "*.jpg" > log
How to modify this string to find not only .jpg files?
find /path/to -regex ".*\.\(jpg\|gif\|png\|jpeg\)" > log
find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -print0
will work. There might be a more elegant way.
find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -exec ls -l {} \;
otherwise the exec only applies to the last part (-iname '*.jpg'
in this case).
Commented
Nov 8, 2018 at 21:50
find /path/to/ -iname '*.gif' -o -iname '*.jpg' -print0
will only print the jpg files! You need brackets here: find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -print0
Commented
Feb 11, 2020 at 16:35
find -E /path/to -regex ".*\.(jpg|gif|png|jpeg)" > log
The -E
saves you from having to escape the parens and pipes in your regex.
-E
option tells find
to use "extended regular expressions". Several other tools have a similar option, but I'm not sure this option is available on all UNIX distributions.
find . -regextype posix-extended -regex ".*\.(jpg|gif|png|jpeg)"
.
Commented
Oct 23, 2015 at 17:37
find -E /path/to -iregex ".*\.(jpg|gif|png|jpeg)" > log
. Using the -iregex
flag tells find
to match case insensitively.
find /path/to/ -type f -print0 | xargs -0 file | grep -i image
This uses the file
command to try to recognize the type of file, regardless of filename (or extension).
If /path/to
or a filename contains the string image
, then the above may return bogus hits. In that case, I'd suggest
cd /path/to
find . -type f -print0 | xargs -0 file --mime-type | grep -i image/
find /path -type f \( -iname "*.jpg" -o -name "*.jpeg" -o -iname "*gif" \)
-iname *.jpg
, -o -name *.jpeg
, -o -iname *gif
all have a slightly different format.
Commented
Apr 26, 2018 at 6:15
-o
- logical OR. Not an inconsistency, just joins together the -iname
clauses. -iname "*gif"
would match a filename ending foogif
, whereas -iname "*.gif"
would not.
Commented
Jul 25, 2022 at 17:57
In supplement to @Dennis Williamson 's response above, if you want the same regex to be case-insensitive to the file extensions, use -iregex :
find /path/to -iregex ".*\.\(jpg\|gif\|png\|jpeg\)" > log
Adding -regextype posix-extended
option only worked in my case:
sudo find . -regextype posix-extended -regex ".*\.(css|js|jpg|jpeg|png|ico|ttf|woff|svg)" -exec chmod 0640 {} \;
in case files have no extension we can look for file mime type
find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }'
where (audio|video|matroska|mpeg) are mime types regex
&if you want to delete them:
find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }' | while read f ; do
rm "$f"
done
or delete everything else but those extensions:
find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 !~ /audio|video|matroska|mpeg/) print $1 }' | while read f ; do
rm "$f"
done
notice the !~ instead of ~