Sharif
Sharif

Reputation: 623

Find all files containing the filename of specific date range on Terminal/Linux

I have a surveillance camera which is capturing image base on my given condition. The images are saved on my Linux. Image naming convention are given below-

CAPTURE04.YYYYMMDDHHMMSS.jpg

The directory contains the following files -

CAPTURE04.20171020080501.jpg
CAPTURE04.20171021101309.jpg
CAPTURE04.20171021101913.jpg
CAPTURE04.20171021102517.jpg
CAPTURE04.20171021103422.jpg
CAPTURE04.20171022103909.jpg
CAPTURE04.20171022104512.jpg
CAPTURE04.20171022105604.jpg
CAPTURE04.20171022110101.jpg
CAPTURE04.20171022112513.jpg ... and so on.

However, Actually, now I'm trying to find a way to get all files between a specific date time (filename) range by using the terminal command. Note: Need to follow the filename (YYYYMMDDHHMMSS), not the file created/modified time.

Such as I need to get all files whose file name is between 2017-10-20 08:30:00 and 2017-10-22 09:30:00

I'm trying and searching google around and got the following command -

find -type f -newermt "2017-10-20 08:30:00" \! -newermt "2017-10-22 09:30:00" -name '*.jpg'

It returns the files which are created/modified on that given date range. But I need to find files base on the given filenames range. So I think it does not work on my condition.

Also trying with the following command-

find . -maxdepth 1 -size +1c -type f \( -name 'CAPTURE04.20171020083000*.jpg' -o -name 'CAPTURE04.2017102209300*.jpg' \) | sort -n

This is not working.. :(

Please help me to write the actual command. Thanks, in advance.

Upvotes: 6

Views: 7748

Answers (3)

RomanPerekhrest
RomanPerekhrest

Reputation: 92854

Complete find + bash solution:

find . -type f -regextype posix-egrep -regex ".*CAPTURE04\.[0-9]{14}\.jpg" -exec bash -c \
'fn=${0##*/}; d=${fn:10:-4}; 
 [[ $d -ge 20171020083000 && $d -le 20171022093000 ]] && echo "$0"' {} \;

  • fn=${0##*/} - obtaining file basename

  • d=${fn:10:-4} - extracting datetime section from the file's basename

  • [[ $d -ge 20171020083000 && $d -le 20171022093000 ]] && echo "$0" - print the filepath only if its datetime "section" is in specified range

Upvotes: 4

Nahuel Fouilleul
Nahuel Fouilleul

Reputation: 19315

as maxdepth option is used means all files are in current directory so can be done in a loop with globs

for file in CAPTURE04.201710{20..22}*.jpg; do
    if [[ $file > CAPTURE04.20171020083000 && $file < CAPTURE04.2017102209300 ]]; then
        ... do something with "$file"
    fi
done

Upvotes: 0

Guru
Guru

Reputation: 16974

One way(bash), not an elegant one:

ls  CAPTURE04.2017102008{30..59}*.jpg CAPTURE04.2017102009{00..30}*.jpg 2>/dev/null

Upvotes: 1

Related Questions