Nihilum
Nihilum

Reputation: 701

Bash iterate through every file but start from 2nd file and get names of 1st and 2nd files

I have files all named following the convention: xxx_yyy_zzz_ooo_date_ppp.tif

I have a python functions that needs 3 inputs: the date of two consecutive files in my folder, and an output name generated from those two dates.

I created a loop that:

How could I make my loop start at the 2nd file in my folder, and grab the name of the previous file to assign it to a variable "file1" (so far it only grabs the date of 1 file at a time) ?

#!/bin/bash

output_path=path # Folder in which my output will be saved

for file2 in *; do 
        
        f1=$( "$file1" | awk -F'[_.]' '{print $5}' )   # File before the one over which the loop is running
        f2=$( "$file2" | awk -F'[_.]' '{print $5}' )   # File 2 over which the loop is running
        outfile=$output_path+$f1+$f2
        function_python -$f1 -$f2 -$outfile
done

Upvotes: 0

Views: 108

Answers (2)

KTorrentNG
KTorrentNG

Reputation: 66

You could make it work like this:

#!/bin/bash

output_path="<path>"

readarray -t files < <(find . -maxdepth 1 -type f | sort)     # replaces '*'

for ((i=1; i < ${#files[@]}; i++)); do
    f1=$( echo "${files[i-1]}" | awk -F'[_.]' '{print $5}' )  # previous file
    f2=$( echo "${files[i]}" | awk -F'[_.]' '{print $5}' )    # current file
    outfile="${output_path}/${f1}${f2}"
    function_python -"$f1" -"$f2" -"$outfile"
done

Not exactly sure about the call to function_python though, I have never seen that tool before (can't ask since I can't comment yet).

Upvotes: 3

Andrej Podzimek
Andrej Podzimek

Reputation: 2778

Read the files into an array and then iterate from index 1 instead of over the whole array.

#!/bin/bash
set -euo pipefail

declare -r output_path='/some/path/'
declare -a files fsegments
for file in *; do files+=("$file"); done
declare -ar files  # optional

declare -r file1="${files[0]}"
IFS=_. read -ra fsegments <<< "$file1"
declare -r f1="${fsegments[4]}"

for file2 in "${files[@]:1}"; do  # from 1
  IFS=_. read -ra fsegments <<< "$file2"
  f2="${fsegments[4]}"
  outfile="${output_path}${f1}${f2}"
  function_python -"$f1" -"$f2" -"$outfile"  # weird format!
done

Upvotes: 1

Related Questions