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

Time:10-26

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:

  • goes through every file in the folder
  • grabs the date of the file and assigns it to a variable ("file2", 5th place in the file name)
  • runs a python function that takes as inputs: date file 1, date file 2, output name

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

CodePudding user response:

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).

CodePudding user response:

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
  • Related