Solved

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

Posted on 2010-09-22
9
466 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
ID: 33740269
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
ID: 33741282
#!/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
ID: 33747031
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
Master Your Team's Linux and Cloud Stack

Come see why top tech companies like Mailchimp and Media Temple use Linux Academy to build their employee training programs.

 

Author Comment

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

Thanks.
0
 
LVL 48

Expert Comment

by:Tintin
ID: 33749841
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
ID: 33750350
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
ID: 33750630
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
ID: 33751146
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
ID: 33784920
Both scripts worked.

Thanks.
0

Featured Post

Master Your Team's Linux and Cloud Stack

Come see why top tech companies like Mailchimp and Media Temple use Linux Academy to build their employee training programs.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

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…
SSH (Secure Shell) - Tips and Tricks As you all know SSH(Secure Shell) is a network protocol, which we use to access/transfer files securely between two networked devices. SSH was actually designed as a replacement for insecure protocols that sen…
Learn how to navigate the file tree with the shell. Use pwd to print the current working directory: Use ls to list a directory's contents: Use cd to change to a new directory: Use wildcards instead of typing out long directory names: Use ../ to move…
Connecting to an Amazon Linux EC2 Instance from Windows Using PuTTY.

808 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