How to find files with regex and list them? - regex

I am new to the whole command-line thing and trying to figure out how to search the current directory and its sub directories for files with a specific filename via regex. Then I want to have the files listed in my command-line.
The regex should match files like:
B2ctes_UCUAAwF-K-large-123x322-132x423.jpg
this_is-a-123-file_name-3124x2445-4235x32.jpeg
file-32x32-64x64.png
The important part is the -[number]x[number]-[number]x[number]
My attempt looks like this:
find . -type f -regex ".+?-\d+x\d+-\d+x\d+\.\w{3,4}" -ls;
There are two problems with this:
-ls puts shows a lot of information. I just want the filenames.
The regex doesn’t work. I have tried to use .+, but even that does not return anything.

You can use this find with regex:
find . -regextype posix-extended -type f -regex ".*-[[:digit:]]+x[[:digit:]]+-[[:digit:]]+x[[:digit:]]+\.[[:alnum:]]{3,4}"
Or on OSX:
find -E . -type f -regex ".*-[[:digit:]]+x[[:digit:]]+-[[:digit:]]+x[[:digit:]]+\.[[:alnum:]]{3,4}"
And without regex:
find . -type f -name "*-[[:digit:]]*x[[:digit:]]*-[[:digit:]]*x[[:digit:]]*.[[:alnum:]]*"

What about simply :
find . -type f -name '-[0-9]*x[0-9]*-[0-9]*x-[0-9]*'
or
find . -type f -regextype posix-egrep -regex '.*-[0-9]+x[0-9]+-[0-9]+x-[0-9]+.*'

Related

Regext start with 3 consecutive capital letters

Have the following regex to detect a file start with 3 consecutive capital letters:
(?=(.*[A-Z]){3})(?=(.*[a-z]){3})(?=.*(_|[^\w]))
When I search a file I found it:
root#node01:~# find . -type f -name DASD-680.mp4.part
./DASD-680.mp4.part
But when I search didn't found any results:
root#RPI01:~# find . -type f -regextype egrep -regex "(?=(.*[A-Z]){3})(?=(.*[a-z]){3})(?=.*(_|[^\w]))"
What's the exactly problem???
Update:
file exists:
TAD-007.mp4
but no result with this:
/usr/bin/find . -type f -regextype posix-extended -regex "[A-Z]{3}.*"
thanks!
find gives list of files prefixed with ./ like ./DASD-680.mp4.part
the regex motif must match the whole filename, included ./
the regex flavor doesn't support quantifiers
Here is a way to do what you want:
find . -type f -regex '..[A-Z][A-Z][A-Z].*'
where the first 2 dots matches ./
You cal also use:
find . -type f -regex '\./[A-Z][A-Z][A-Z].*'

using shell variable in find regex

i would like to delete files with some pattern(like start with 'test')that older than 1 day, i have:
mydir=/find/my/path
find $mydir -type f -mtime -1\
-regextype egrep -regex '$mydir\/test.*'\
-delete
but it did not delete files for me, i tried
mydir=/find/my/path
find $mydir -type f -mtime -1\
-regextype egrep -regex '.*\/test.*'\
-delete
this one works. Why did the first not work? according to
'find' using regex with variables
i can use variable in find regex, what's wrong?
It's because in the 1st one, you tried to evaluate a variable $mydir inside a single inverted comma with '$mydir\/test.*'. This won't evaluate the $mydir's value and will be taken literally as $mydir.
Use double inverted comma here and try again with
mydir=/find/my/path
find $mydir -type f -mtime -1\
-regextype egrep -regex "$mydir\/test.*"\
-delete
Gaganshera's answer already explains the the problems in your script and shows how to fix them. This is a different but equivalent solution combining find and globs:
mydir=/find/my/path
find "$mydir"/test* -type f -mtime -1 -delete

pattern to match multiple filenames with find utility

How to find multiple filenames with the bash find command?
$ find /path/* -type f -name pattern
The pattern should match a list of file names:
fname1.jpg
fname2.png
myfile.css
example.gif
I tryed with
https://alvinalexander.com/linux-unix/linux-find-multiple-filenames-patterns-command-example
find multiple filenames command: finding three filename extensions
find . -type f \( -name "*cache" -o -name "*xml" -o -name "*html" \)
and it works.
Anyway I think it would be cleaner with a -name pattern, rather than with a list of -names.
from
$ man find
-name pattern
I m searching for something like: -name '[fname2.png|myfile.css|example.gif ]'
-regex alternative would look as follows:
find . -type f -regextype posix-egrep -regex ".+\.(jpg|png|css)$"
As for -name option:
-name pattern - Base of file name (the path with the leading
directories removed) matches shell pattern.
Shell pattern is not a full-fledged regex pattern.
Just mix them:
find -name "aoc*" -regextype awk -regex ".*[0-9].(class|scala)"
This searches for files, matching shell-pattern aoc* and end in number, with ending .class or .scala.
For your example:
find -name "fname*" -regextype awk -regex ".*[0-9].(png|jpg|css)"
Available types are listet with:
find -regextype -help
However, I first tried "-regextype sed" which is available, but sed itself has options, changing the styles of regexes. And patterns I used to use with sed didn't work, but since the pattern works with awk, it's sufficient for me.

Shell - How to deal with find -regex?

I need to look in a directory for sub-directories that all start by "course" but they have version next. For example
course1.1.0.0
course1.2.0.0
course1.3.0.0
So how should I modify my command to make it give me the right list of directories?
find test -regex "[course*]" -type d
You can do:
find test -type d -regex '.*/course[0-9.]*'
it will match files whose name is course plus an amount of numbers and dots.
For example:
$ ls course*
course1.23.0 course1.33.534.1 course1.a course1.a.2
$ find test -type d -regex '.*course[0-9.]*'
test/course1.33.534.1
test/course1.23.0
You need to remove the brackets, and use the proper wildcard syntax for regexes (.*):
find test -regex "course.*" -type d
You can also use the more familiar shell wildcard syntax, by using the -name option instead of -regex:
find test -name 'course*' -type d
I suggest using a regex for precise matching of version number sub directories:
find . -type d -iregex '^\./course\([0-9]\.\)*[0-9]$'
TESTING:
ls -d course*
course1.1.0.0 course1.1.0.5 course1.2.0.0 course1.txt
find . -type d -iregex '^\./course\([0-9]\.\)*[0-9]$'
./course1.1.0.0
./course1.1.0.5
./course1.2.0.0
UPDATE: To match [0-9]. exactly 3 times use this find command:
find test -type d -regex '.*/course[0-9]\.[0-9]\.[0-9]\.[0-9]$'

How to combine command substitution and regex?

Is there a possibility to do command substitution in a regex?
I want to find files in Linux with specific names. The name may include fix strings, but it may also only include the hostname.
So what i want to do is something like:
find /home/ -type f -regextype posix-extended -regex '.*(string1|string2|`hostname`).*'
I'm not sure whether it's possible to somehow concat the output of the hostname command with the regex?
Thanks in advance!
Try this :
find /home/ -type f -regextype posix-extended -regex ".*(string1|string2|$HOSTNAME).*"
if you need to use a command instead :
find /home/ -type f -regextype posix-extended -regex ".*(string1|string2|$(hostname)).*"