Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
?
Solved

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

Posted on 2010-09-22
9
Medium Priority
?
478 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 500 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
Visualize your virtual and backup environments

Create well-organized and polished visualizations of your virtual and backup environments when planning VMware vSphere, Microsoft Hyper-V or Veeam deployments. It helps you to gain better visibility and valuable business insights.

 

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 500 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

Free recovery tool for Microsoft Active Directory

Veeam Explorer for Microsoft Active Directory provides fast and reliable object-level recovery for Active Directory from a single-pass, agentless backup or storage snapshot — without the need to restore an entire virtual machine or use third-party tools.

Question has a verified solution.

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

It’s 2016. Password authentication should be dead — or at least close to dying. But, unfortunately, it has not traversed Quagga stage yet. Using password authentication is like laundering hotel guest linens with a washboard — it’s Passé.
Google Drive is extremely cheap offsite storage, and it's even possible to get extra storage for free for two years.  You can use the free account 15GB, and if you have an Android device..when you install Google Drive for the first time it will give…
This video shows how to set up a shell script to accept a positional parameter when called, pass that to a SQL script, accept the output from the statement back and then manipulate it in the Shell.
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.
Suggested Courses
Course of the Month14 days, 17 hours left to enroll

578 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