I’m sorry to be posting about another problem with the same script that I was working on yesterday.
Originally I had a problem with it cding to paths with spaces, though that is fixed now. The problem is that if a 3rd argument is given to the script, it is to search for it within the files it found earlier and then print the files location as well as the line number the term was found on.
For some reason grep isn’t liking paths to files that contain spaces (again right? -.-) even though I have double quoted the variable I am greping.
Does anyone have any ideas about how to fix it?
#!/bin/bash
path = $1 #1st arg is the path to be searched
regex = $2 #2nd arg is a regular expression
searchTerm = $3 #3rd arg is an optional search term
startDir = `pwd` #Stores the starting path
getDirs()
{ #Function to get the directories
for i in "$1"
; do
if [ -d "$i" ]; then
echo "$i" >> temp.txt
getDirs "$i"
fi
done
}
getFiles() { # Function to get files matching the regex
while IFS= read -r path; do # While there is a line, read it, backslash is not a delimiter
cd "$path"
temp=`ls -1 | grep "$regex"` #List the contents of the dir. Store only files that match the regex
for j in $temp
do
echo "$path/$j" # For every file stored, print its location
done
cd $startDir
done < temp.txt # Read from temp.txt
}
searchFiles() { # Function to search within files
for a in $output1 # For every file found
do
out=`grep -n "$searchTerm" "$a" | cut -d: -f 1` # Find the line numbers in which it is present, stop showing after 1st :
for i in $out # For every line found
do
echo "$a: line $i" # Print the file location, and the line numbers of the terms
done
done
}
numArgs=$#
echo "$path" >> temp.txt
getDirs $path # Getting directories to search
output1=`getFiles`
cd $startDir
if [ $numArgs == 3 ] # If a search term is specified
then
searchFiles # Then search the files for it
else
echo "$output1" # Otherwise, just print the location of the files
fi
rm temp.txt # Removing temporary files
exit 0
Your script has a LOT of problems including unquoted and incorrectly quoted variables. Here’s how your getFiles function need to be written at a minimum (there are other issues like whether grep is really necessary and use of echo but I’m not touching those so this highlights the serious problems):
Note that “temp” is now an array, not a string, so you can access the file names it contains one at a time and still have each of them quoted. I just renamed it tempA to make it obvious that it’s an Array.
So, update your script to use arrays instead of strings to hold your file names as demonstrated above, get rid of the spaces around the assignments, quote all of your variables, use $(…) instead of backticks, and change
grep -n "$searchTerm" "$a" | cut -d: -f 1toawk -v st="$searchTerm" '$0~st{print NR}' "$a"then repost if you still have problems.