Igor Queiroz
Igor Queiroz

Reputation: 1

How to iterate a file filled with file and directory paths to check what they are

I have a problem which is iterating a file called for example: fileAndFolderPaths, and in other script I have to iterate this same file and check if each line is a file or folder path.

fileAndFolderPaths

/opt/sampleFolder
/opt/sampleFolder/aText.txt
/opt/otherFolder

Then my script file is something like that:

myScript.sh

#!/bin/bash

mapfile -t array < /tmp/fileAndFolderPaths

function checkIfFilesOrFolder(){

for i in "${array[@]}" do
   if [ -f $i ]; then
     echo -e "[Info] found the file: $i"
   elif [ -d $i ]; then
     echo -e "[Info] found the directory: $i"
   else
     echo -e "[Error] Nor directory or file were found based on this value: $i"
   fi
done
}

checkIfFilesOrFolder

exit 0;

The problem is the check only works for the last line of the array created by the mapfile command. Any thoughts about that? I'm new to shell scripting so probably this is a really basic problem, but even so I wasn't able to fix it yet.

Upvotes: 0

Views: 33

Answers (1)

glenn jackman
glenn jackman

Reputation: 246774

A couple of review suggestions, if you don't mind:

  1. Don't need the global variable: pass the filename to the function and loop over the file:

    checkIfFilesOrFolder() {
        local file=$1
        while IFS= read -r line; do
            # test "$line" here ...
        done < "$file"
    }
    
    checkIfFilesOrFolder /tmp/fileAndFolderPaths
    

    I recommend using local for function variables, to minimize polluting the global namespace.

  2. Always quote your variables, unless you're aware of exactly what expansions occur on them unqoted:

    if [ -f "$line" ]; then ...
    
  3. is there a reason you're using echo -e? The common advice is to use

    printf '[Info] found the file: %s\n' "$line"
    

    Interesting reading: Why is printf better than echo?

Upvotes: 1

Related Questions