The directories you are searching, the strings you are matching, the names of the files you are processing in the directories you are searching, and the shell you are using seems to change with every post you make. We can't keep up with all of the changes you are making and we still do not have a clear description of what you are trying to do. (Especially whether some of the pathnames you are supplying are the names of files to be processed or the names of directories [AKA folders] containing files to be processed.)
But some problems with your code in post #26:
#list all folders for FTR
folderFTR="/files05/home/chgtpst/GT/outb/CHTR/FTR/9/archive_ia
/files05/home/chgtpst/GT/outb/CHTR/FTR/9/send_ia
/files05/home/chgtpst/GT/outb/CHTR/FTR/9/send"
#list all folders for VRZ
folderVRZ="/files05/home/chgtpst/GT/outb/CHTR/VRZ/9/archive_ia
/files05/home/chgtpst/GT/outb/CHTR/VRZ/9/send
/files05/home/chgtpst/GT/outb/CHTR/VRZ/9/send_ia/success"
#Main program for FTR
for f in $folderFTR
do
if [ 'grep FTRORD -l "$f"' ]
then
echo "invalid file in $f" >> /home/abainzd/logfile.txt
else
exit 1
fi
done
#Main program for VRZ
for f in $folderVRZ
do
if [ 'grep CHTRVRZPRD -l "$f"' ]
then
echo "Invalid file in $f" >> /home/abainzd/logfile.txt
else
exit 1
fi
done
include (but might not be limited to):
- You have said you are using the Korn shell, but there is nothing in this script that specifies that. Make the 1st line of your script be
#!/bin/ksh
.
- We can't tell from what you have shown us whether the three pathnames you assigned to the shell variable
folderVRZ
are the names of directories (which you call folders) or are pathnames of three regular files in the directory /files05/home/chgtpst/GT/outb/CHTR/VRZ/9
.
- The test command
[ 'grep FTRORD -l "$f"' ]
ALWAYS evaluates to true because the argument being evaluated 'grep FTRORD -l "$f"'
is a non-empty fixed string. It does not execute grep
and it does not expand "$f"
(shell variables are not expanded when they are surrounded by single quotes) to the name of a file (directory or regular file). And, assuming (based solely on the name of your variables) that you intend for $f
to expand to the name of a directory, the grep
utility looks for matches to a regular expression in the text file(s) named as its file operand(s); it does NOT search all of the files in a directory named as a file operand and it does not try to match filenames in a directory to your regular expression. The behavior of grep
is only defined when the pathnames of the files you ask it to process are text files (and directories are not text files)!
I apologize for not noticing that you used /bin/sh
when you ran my script instead of /bin/ksh
) after you had told us at least three times that you were using the Korn shell.
I apologize for not mentioning that you would have to use /usr/xpg4/bin/grep
instead of /usr/bin/grep
to use the -q
option.
I have absolutely no explanation for why you modified the script I suggested in post #21 to process the four files you described in post #20:
cd home/solaris/unix/samplefiles/ && \
for file in *.txt
do if ! grep -q davehandsome "$file"
then printf 'File "%s" does not contain the string "davehandsome"\n' "$file"
fi
done
to:
cd $EDI_ROOT/GT/outb/CHTR/VRZ/9/send && \
for file in *.edi
do if ! /usr/xpg4/bin/grep -q CHTRVRZPRD "$file"
then printf 'File "%s" does not contain the string "CHTRVRZPRD"\n' "$
file"
fi
done
and ran it in a directory where there are no filenames that end with the string .edi
when you said you wanted to look for a different string in one of four existing files in a different directory.
If you had told us that some of the directories you want to search do not contain any files, we would have suggested different code, perhaps something more like:
#!/bin/ksh
EDI_ROOT="/absolute/path/to/directory"
# The absolute pathname of the directory named by EDI_ROOT must contain a
# subdirectory accessible by the relative pathname "BT/outb/CHTR/VRZ/9/send".
cd $EDI_ROOT/GT/outb/CHTR/VRZ/9/send && \
for file in *.edi
do if [ -f "$file" ] && ! /usr/xpg4/bin/grep -q CHTRVRZPRD "$file"
then printf 'File "%s" does not contain "CHTRVRZPRD"\n' "$file"
fi
done
Note that case matters in Solaris and other UNIX systems. The string "UNIX" and the string "unix" are NOT the same. (Case matters!)
If you were asked (as an EE) to create a circuit that is given +5V DC power and instead of +5V DC power the user connected it to 120V AC power, should we be disappointed if your circuit exploded? If you tell us you want to search for a string in a bunch of files that match a certain filename matching patter in a directory, don't be surprised if a grep
command that we suggest doesn't do what you want if you ask it to process files matching a pattern that does not match any files in that directory. If you tell us you want to search for a string in a bunch of files in a directory, don't be surprised if a grep
command that we suggest doesn't do what you want if you give it the name of a directory to process instead of a list of one or more files in that directory to process.
Computers can do some things very quickly. They usually do exactly what you ask them to do even if what you ask them to do is dangerous. In CS we have a frequently referenced acronym: GIGO (Garbage In, Garbage Out). If your specifications are not clear (GI), the results you get from running code written to meet what the programmer guesses you meant are likely to give you GO.
Please help us help you!