For loop without checking file exists


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting For loop without checking file exists
# 1  
Old 04-19-2016
For loop without checking file exists

In several scripts that process files matched by name pattern I needed to add a check for file existence. Just to illustrate let's say I need to process all N??? files:
Code:
/tmp$ touch N100 N101
/tmp$ l ?10[01]
-rw-rw-r--   1 moss     group          0 Apr 19 11:22 N100
-rw-rw-r--   1 moss     group          0 Apr 19 11:22 N101
/tmp$ for fn in N???; do echo $fn; ls -l $fn; done
N100
-rw-rw-r--   1 moss     group          0 Apr 19 11:22 N100
N101
-rw-rw-r--   1 moss     group          0 Apr 19 11:22 N101

If there is no N files, this for loop would try to execute ls with non-existent pattern:
Code:
/tmp$ rm N???
/tmp$ for fn in N???; do echo $fn; ls -l $fn; done              
N???
ls: N??? not found: No such file or directory (error 2)

To avoid running a process against non-existent file I add if file exists check:
Code:
/tmp$ for fn in N???; do if [ -f $fn ]; then ls -l $fn; fi; done
/tmp$

Is there any way in shell to not use those file exists checks and still run process only for an exisant file?
# 2  
Old 04-19-2016
Hello migurus,

Could you please try following and let me know this helps you.
Code:
for fn in N???; do if [[ -f $fn ]]; then echo $fn; ls -l $fn; fi; done

Above will not print anything errors on standard output. Although you could simply use following too.
Code:
for fn in N???; do echo $fn; ls -l $fn; done 2> /dev/null

But only thing above will print value N??? even it is not present but no error will be printed on standard output, so in case you don't want to print filename then you could directly use as follows.
Code:
for fn in N???; do ls -l $fn; done 2> /dev/null

I hope this helps you.

Thanks,
R. Singh
# 3  
Old 04-19-2016
How about
Code:
ls N??? 2>/dev/null | while read fn; do echo "$fn"; ls -l "$fn"; done

# 4  
Old 04-19-2016
I guess I don't understand why you need both echo "$fn" and ls -l "$fn"???
Doesn't just using:
Code:
ls -l N??? 2>/dev/null

convey the same information?
This User Gave Thanks to Don Cragun For This Post:
# 5  
Old 04-19-2016
I added the echo in the loop to show that when nothing matches the N??? pattern the fn variable assumes value of N??? and that is the root of the question - when using
Code:
for fname in some_pattern

construct I thought the pattern evaluation happens before do and shell would simply not enter the do loop part when nothing matches.
This User Gave Thanks to migurus For This Post:
# 6  
Old 04-19-2016
Quote:
Originally Posted by migurus
I added the echo in the loop to show that when nothing matches the N??? pattern the fn variable assumes value of N??? and that is the root of the question - when using
Code:
for fname in some_pattern

construct I thought the pattern evaluation happens before do and shell would simply not enter the do loop part when nothing matches.
Some, shells have an option (as an extension to the standards) that does remove globbing patterns that do not match any existing files. For instance, if you are using a recent bash, the code:
Code:
shopt -s nullglob
for i in N???
do	printf '%s\n' "$i"
done

would not run the loop at all if N??? does not match any files in the current working directory, while the other options work with any shell based on Bourne shell syntax:
Code:
for i in N???
do	if [ "$i" = "N???" ]
	then	break
	fi
	printf '%s\n' "$i"
done

which works fine as long as you know that there will never be a file actually named N???. (Note that the break could be replaced by a continue and get the same results.) Or, you can use:
Code:
for i in N???
do	if [ -e "$i" ]
	then	continue
	fi
	printf '%s\n' "$i"
done

(Note that you need to use continue in this form (not break) to protect yourself in case a file is removed while the loop is running (you just want to skip processing the file that was removed; not skip processing other remaining files with names that sort after the file that was removed).
These 2 Users Gave Thanks to Don Cragun For This Post:
# 7  
Old 04-19-2016
Thank you, good to know about nullglob, although the target system uses ksh and shopt is not an option.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Problem with ssh and checking if file exists

Hi All, I am facing a problem while checking for existence of file over ssh ! Basically, i want to ssh and check if file exists.. If file exists return 1. If file does not exits return 0 (or any value) I am using the below code file_avail=`ssh username@host "if ]; then exit 1;... (10 Replies)
Discussion started by: galaxy_rocky
10 Replies

2. Shell Programming and Scripting

Checking if file exists and unzipping

Hey, I am new to scripting and was wondering what is wrong with this if statement. I want to check if file exists and the if it does to unzip it. I program it as follows if ; then gunzip *_filename.gz fi Thanks in advance! Please use code tags next time for your code and data. (10 Replies)
Discussion started by: mostarac2487
10 Replies

3. Shell Programming and Scripting

while loop checking for file

Hi I my shell scripting(Main.ksh) i am calling the another loader.ksh using nohup inside the for loop ...so the above command runs parallel. Loader.ksh generate the dummy file seq_n.run file and deleted in the end of the Loader.ksh In the main.ksh .. after the for loop .. i have to check... (1 Reply)
Discussion started by: gavemani
1 Replies

4. Shell Programming and Scripting

Checking whether the file exists under a directory and doing a diff

Hi Everyone, I am writing a shell script for the below needs and would like your suggestions and advices. I have a lot of scripting files(Shell Scripts) under the directory: /home/risk_dev/dev I have another directory which has a lot of shell scripts under the directory: ... (2 Replies)
Discussion started by: filter
2 Replies

5. Shell Programming and Scripting

what is the difference between -f and -e, when checking for file exists

Hi All, what is the difference between -f and -e. Regards, ch33ry (1 Reply)
Discussion started by: ch33ry
1 Replies

6. Shell Programming and Scripting

Checking if file exists

How can I check if a file exists in csh? I know there is "-e $file" but do not know exactly how to use it. I have tried the below but I'm getting "Bad : modifier in $ ( )." foreach f ($AfullnameLst) if (-e $f) then echo "$f: file exists" endif end (6 Replies)
Discussion started by: kristinu
6 Replies

7. Shell Programming and Scripting

Checking if file exists using a NOT operator and shell variable

Hi, I'm new to UNIX, at least shell programming and am having trouble figuring out a problem i'm having. In one section in my nested if statement, i want the program to test if the file does not exist, based on an argument supplied at the command line by the user. What i have is elif ; then... (3 Replies)
Discussion started by: rowlf
3 Replies

8. Shell Programming and Scripting

Checking if a file exists

How can I check if a file exists in shell script. Basically, I want to check if a file Test_msgs has been created today. If it has been then append data to it. Otherwise, create it. I have written the following but it does not work. todaysdate=$(date +%d%m%Y) timenow=$(date +%H%M%S)... (4 Replies)
Discussion started by: gugs
4 Replies

9. Shell Programming and Scripting

Checking the file if it exists

Hi This will be useful who is looking for checking the files in a directory #chmod 777 /cronacle/tools/teradata/opo/bin/file_check.sh SUBJECT=`echo "File Not Found"` SUBJECT1=`echo "File Found"` #RECIPIENT=Madhu.Reddy@ge.com cd /cronacle/tools/teradata/opo/bin file_list=attach.sh if ... (3 Replies)
Discussion started by: ksmbabu
3 Replies

10. IP Networking

checking a connection still exists?

Hi I have a bit of c code which I'm trying to use as a relay between apache and a scgi cluster. Example of problem code is below: while((n = recv(scgiSock, local_data, MAX_LENGTH, 0)) > 0) { time(&t2); time_now = t2 - t1; if(time_now > TIMEOUT) ... (2 Replies)
Discussion started by: fishman2001
2 Replies
Login or Register to Ask a Question