skip to Main Content

I have a folder with several numeric subfolders:

.
├── 1
├── 2
├── 3
├── 4
└── 5_a

I would like to find the one with the highest value. In this example it would be folder 4.

The folders can also be numbered:

.
├── 1e-3
├── 2e-3
├── 3e-3
├── 4e-3
└── 5e-3_a

How can I achieve this? The code is to be used in a bash script for batch processing.

I have tried: find . -type d -regex '.*/[0-9][^/]*' |sort -rn -t '' |head -n 1 but the regex syntax will not filter out exclusive numerical folders.

Best Regards

2

Answers


  1. I like extended globbing for things like this.

    $: ls -ld *
    drwxr-xr-x 1 paul 1049089 0 Sep  7 09:35 1
    drwxr-xr-x 1 paul 1049089 0 Sep  7 09:35 2
    drwxr-xr-x 1 paul 1049089 0 Sep  7 09:35 3
    drwxr-xr-x 1 paul 1049089 0 Sep  7 09:35 4
    drwxr-xr-x 1 paul 1049089 0 Sep  7 09:35 5_e
    
    
    $: shopt -s extglob   # turn on extended globbing
    $: lst=( +([0-9])/ )  # get non-hidden directories named with only digits
    $: echo ${lst[-1]%/}  # show the highest
    4
    

    edit

    Feeling stupid for posting that without correcting for lexical sorts…
    Thanks, Glenn, for calling me on it.

    Stealing some of @anubhava’s logic to grab the numeric max, including the parsing of the scientific notation.

    $: ls -ld *
    drwxr-xr-x 1 paul 1049089 0 Sep  7 09:35 1
    drwxr-xr-x 1 paul 1049089 0 Sep  7 09:35 2
    drwxr-xr-x 1 paul 1049089 0 Sep  7 10:13 2e-3
    drwxr-xr-x 1 paul 1049089 0 Sep  7 09:35 3
    drwxr-xr-x 1 paul 1049089 0 Sep  7 10:13 3e-3
    drwxr-xr-x 1 paul 1049089 0 Sep  7 09:35 4
    drwxr-xr-x 1 paul 1049089 0 Sep  7 10:13 4e-3
    drwxr-xr-x 1 paul 1049089 0 Sep  7 09:35 5_e
    drwxr-xr-x 1 paul 1049089 0 Sep  7 10:13 5e-3_a
    drwxr-xr-x 1 paul 1049089 0 Sep  7 10:13 e-3
    
    
    $: printf  '%s' +([0-9])*(e-[0-9])/ |
    >   awk -v RS='' -F '/' '$1+0 > max {max = $1} END {print max}'
    4
    
    Login or Signup to reply.
  2. You may try this find | awk command to find the greatest numerical value of a sub-directory name (gnu-awk will be required due to multi-char RS):

    awk can handle scientific notation numerical strings as well.

    find . -type d -name '*[0-9]*' -print0 |
    awk -v RS='' -F '\.?/' '
    $NF+0 == $NF && $NF > max {max = $NF} END {print max}'
    
    4
    

    Or if all of your sub-directories at level 1 only, you may use this printf | awk solution:

    printf '%s' *[0-9]*/ |
    awk -v RS='' -F '/' '
    $1+0 == $1 && $1 > max {max = $1} END {print max}'
    
    4
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search