nass
nass

Reputation: 1485

grabbing the newest file from a subset of the contents of a folder in bash

I have a folder with such contents

nass@starmaze:~/audio_setup/scripts$ ls -l ../jmess/
total 32
-rw-rw-r-- 1 nass users 1573 Νοέ  16  2014 jmess_fxio56-78feedsHDA-play12.jmess
-rw-rw-r-- 1 nass nass  1573 Δεκ  13  2014 jmess_pb-2.jmess
-rw-rw-r-- 1 nass nass  1573 Δεκ  20  2014 jmess_pb-3.jmess
-rw-rw-r-- 1 nass nass  1939 Ιούν 12 13:05 jmess_starmazeOnMaster.jmess
-rw-rw-r-- 1 nass nass  2163 Δεκ  15  2014 jmess_starmazeOnMaster.jmess.bak1-art
-rw-rw-r-- 1 nass nass  2161 Δεκ  15  2014 jmess_starmazeOnMaster.jmess.bak2-bcr
-rw-rw-r-- 1 nass nass  2389 Δεκ  22  2014 jmess_starmazeOnMaster.jmess.bak3-hoo
-rw-rw-r-- 1 nass nass  2163 Δεκ  15  2014 jmess_starmazeOnMaster.jmess.bak4-dsp

I want to be able to pick up the newest file, but only from the subset of files that do not contain the word "Master" in them. And I want to put that in a bash script.

So this

ls -t1 "${JCMESS_FOLDER}" | head -n1

provides the newest file in the folder , while this

ls -t1 "${JCMESS_FOLDER}"/!(*Master*) | head -n1

provides the newest file among the subset that I am interested in.

However, when I place the latter in a bash script as

$NEWEST_JCMESS_FILE=$( ls -t1 "${JCMESS_FOLDER}"/!(*Master*) | head -n1 )

it does not work:

./06.load_jcmess: command substitution: line 8: syntax error near unexpected token `('
./06.load_jcmess: command substitution: line 8: ` ls -t1 "${JCMESS_FOLDER}"/!(*Master*) | head -n1 )'

I am not sure what is wrong in this case and I ahve not been able to successfully find an answer for this.

thank you in advance for your help

Upvotes: 2

Views: 29

Answers (1)

Charles Duffy
Charles Duffy

Reputation: 295353

This is BashFAQ #3:

newest() {
  local candidate result=$1; shift    # start with first argument as candidate
  [[ -e $result ]] || return          # handle case where nothing matched

  for candidate; do                   # for loop default behavior is to loop over "$@"
    [[ $candidate -nt $result ]] && result=$candidate
  done
  printf '%s\n' "$result"
}

shopt -s extglob # enable extglobs, ie. !(...)
newest_file=$(newest "$JCMESS_FOLDER"/!(*Master*))

Upvotes: 3

Related Questions