Solved

Need help with BASH script to check existence of file and use an exclude list

Posted on 2010-09-22
9
462 Views
Last Modified: 2013-12-16
I'd like to create a Bash Script that will allow me to check the existence of a file in a directory and touch that file if it doesn't exist.  At the same time, I would like an exclusion list that will exclude certain directories from having that file touched.  Please see what I have so far.  I'm stuck on the excludes file:

#!/bin/bash

BASEDR="/var/lib/test"
TEMPFILE="/tmp/export_tmp"
CONFFILE="/root/conf/excludes.conf"


for i in `find $BASEDR -name "*stuff" -print`;

do

ls $i/hello > /dev/null 2>&1

rc=$?

[ $rc -ne 0 ] && echo "$i doesn't have the file."


done
0
Comment
Question by:unix_admin_1234
  • 4
  • 2
  • 2
  • +1
9 Comments
 
LVL 2

Expert Comment

by:madan1278
Comment Utility
Actually you don't need to test the existence of the file as touch command will do nothing if a file exists already...but I have just included a check for this as well. You just need to focus on the exclude list.

I don't have a system to test the below code but it should work..
#!/usr/bin/bash
#Input the filename with absolute path as a argument to the script.
FILE_TO_CHECK=$1
#Input the absolute path of dirs you want to exclude in the exclude file referenced below
EXCLUDE_LIST=`cat /tmp/exclude.txt` #Variable just for reference
FILENAME=`basename $1`
DIRNAME=`dirname $1`
grep $DIRNAME /tmp/exclude.txt > /dev/null
if [ $? -eq 0 ]
then
[ ! -f $1 ] && touch $1
else
echo "This dir is excluded"
fi
0
 
LVL 9

Accepted Solution

by:
fcontrepois earned 125 total points
Comment Utility
#!/bin/bash

BASEDR="/var/lib/test"
TEMPFILE="/tmp/export_tmp"
CONFFILE="/root/conf/excludes.conf"

for i in `find $BASEDR -name "*stuff" -print`;

do

[ ! -f $i/hello ] && echo "$i doesn't have the file." && continue

toucn $i

done
0
 

Author Comment

by:unix_admin_1234
Comment Utility
madan1278.  Your script is close.  However, the FILE_TO_CHECK need to include a way to find the files in a specific directory.  For example, I would want the script to look under /var/reps/ and look for a directory ending in .test/filename.   There are a lot of directories and subdirectories which include this pattern.  Please let me know if this doesn't make sense.

Thanks.
0
 

Author Comment

by:unix_admin_1234
Comment Utility
Also, I want to include the files to excludes, and not the directories.

Thanks.
0
How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

 
LVL 48

Expert Comment

by:Tintin
Comment Utility
Your requirements are very unclear.

It appears you are wanting to check for the existence of the file 'hello' in directories and sub-directories under /var/lib/test (excluding certain directories) and creating hello if it doesn't exist.

Is that correct?

If so, then you can do
#!/bin/bash
BASEDIR=/var/lib/test
CONFFILE=/root/conf/excludes.conf

find $BASEDIR -name "hello"  | grep -vf $CONFFILE | xargs -I touch {}

Open in new window

0
 
LVL 2

Assisted Solution

by:madan1278
madan1278 earned 125 total points
Comment Utility
Give it shot....twigged slightly to exclude files and included some patterns for directories and filenames.

#!/usr/bin/bash
#Input the filename with absolute path as a argument to the script.
BASE_DIR="/var/reps"
DIR_PATTERN=".test"
FILE_PATTERN="filename"
FILE_TO_CHECK=`find $BASE_DIR/$DIR_PATTERN -name $FILE_PATTERN -print`
#Input the absolute path of files you want to exclude in the exclude file referenced below
EXCLUDE_LIST=`cat /tmp/exclude.txt` #Variable just for reference
if [ ! test -z "$FILE_TO_CHECK" ]
then
   for file_pattern in `echo $FILE_TO_CHECK
   do
 FILENAME=`basename $file_pattern`
 grep $FILENAME /tmp/exclude.txt > /dev/null
 if [ $? -ne 0 ]
 then
    touch $file_pattern
 else
    echo "This file is excluded"
 fi
   done
fi
 
0
 

Author Comment

by:unix_admin_1234
Comment Utility
Tintin, that's exactly what I am looking to do.  I like the brevity of your script, but I'm unclear what the xargs -I touch {} does.  I tried to run the script and keep getting the error:  
+ xargs -I touch '/test{}'
xargs: /git-daemon-export-ok{}: No such file or directory

Thanks.
0
 
LVL 48

Expert Comment

by:Tintin
Comment Utility
Sorry, my typo.  It can actually be simplified to

find $BASEDIR -name "hello"  | grep -vf $CONFFILE | xargs touch

0
 

Author Closing Comment

by:unix_admin_1234
Comment Utility
Both scripts worked.

Thanks.
0

Featured Post

IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

Setting up Secure Ubuntu server on VMware 1.      Insert the Ubuntu Server distribution CD or attach the ISO of the CD which is in the “Datastore”. Note that it is important to install the x64 edition on servers, not the X86 editions. 2.      Power on th…
Why Shell Scripting? Shell scripting is a powerful method of accessing UNIX systems and it is very flexible. Shell scripts are required when we want to execute a sequence of commands in Unix flavored operating systems. “Shell” is the command line i…
In a previous video, we went over how to export a DynamoDB table into Amazon S3.  In this video, we show how to load the export from S3 into a DynamoDB table.
This demo shows you how to set up the containerized NetScaler CPX with NetScaler Management and Analytics System in a non-routable Mesos/Marathon environment for use with Micro-Services applications.

728 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now