Searching File in Directory and all Subdirectory and Delete


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Searching File in Directory and all Subdirectory and Delete
# 15  
Old 02-09-2015
Hi Don,

Sorry its AIX 6. I changed the pfile instead of filename but still result is same.

My question is we are giving cmp only one parameter but 2nd parameter we are not giving which should be recursive picking file name one by one from directory structure /u50/payments1. Sorry to disturb you again and again.

Thanks
# 16  
Old 02-09-2015
Quote:
Originally Posted by John William
Hi Don,

Sorry its AIX 6. I changed the pfile instead of filename but still result is same.

My question is we are giving cmp only one parameter but 2nd parameter we are not giving which should be recursive picking file name one by one from directory structure /u50/payments1. Sorry to disturb you again and again.

Thanks
No. The {} in:
Code:
-exec cmp -s "$Filename" {} \;

is replaced by the pathname of a file to be tested by find and it works perfectly when I try it on my MacBook Pro running OS X Yosemite. The only reason to get that diagnostic message from cmp is if the variable name used in the for loop does not match the variable name expanded in the find -exec primary or something else on that line does not match the text I suggested.

Please change the 1st line of your script to the following two lines:
Code:
#!/usr/bin/ksh
set -xv

rerun your script, and show us the exact output it produces (in CODE tags).
# 17  
Old 02-10-2015
Thanks Don. I will run it tomorrow and let you know.

---------- Post updated 02-10-15 at 10:44 AM ---------- Previous update was 02-09-15 at 09:16 PM ----------

This is what I got

Getting list of parameters.
File Name is: /home/rkath/o34620760.out

Getting list of files to purge from /xxtd/u20/xx_payments:
Code:
for pfile in "$Filename"
do	ls -l "$pfile" | (
		read x x user group x
		find /xxtd/u20/xx_payments -user "$user" -group "$group" -type f \
			-exec cmp -s "$pfile" {} \; \
			-exec echo rm {} +
		echo rm "$pfile"
	)
done

Code:
+ ls -l /home/rkath/o34620760.out
+ read x x user group x
+ find /xxtd/u20/xx_payments -user rkath -group staff -type f -exec cmp -s /home/rkath/o34620760.out {} ; -exec echo rm {} +
Usage: cmp [-l | -s] File1 File2
+ echo rm /home/rkath/o34620760.out
rm /home/rkath/o34620760.out
return 0
+ return 0


Last edited by Don Cragun; 02-10-2015 at 11:11 AM.. Reason: Add CODE and ICODE tags.
# 18  
Old 02-10-2015
Quote:
Originally Posted by John William
Thanks Don. I will run it tomorrow and let you know.

---------- Post updated 02-10-15 at 10:44 AM ---------- Previous update was 02-09-15 at 09:16 PM ----------

This is what I got

Getting list of parameters.
File Name is: /home/rkath/o34620760.out

Getting list of files to purge from /xxtd/u20/xx_payments:
Code:
for pfile in "$Filename"
do	ls -l "$pfile" | (
		read x x user group x
		find /xxtd/u20/xx_payments -user "$user" -group "$group" -type f \
			-exec cmp -s "$pfile" {} \; \
			-exec echo rm {} +
		echo rm "$pfile"
	)
done

Code:
+ ls -l /home/rkath/o34620760.out
+ read x x user group x
+ find /xxtd/u20/xx_payments -user rkath -group staff -type f -exec cmp -s /home/rkath/o34620760.out {} ; -exec echo rm {} +
Usage: cmp [-l | -s] File1 File2
+ echo rm /home/rkath/o34620760.out
rm /home/rkath/o34620760.out
return 0
+ return 0

There is a HUGE difference between the code you have here and what I suggested in post #10 in this thread:
Code:
for pfile in "$@"

Since Filename is an undefined variable in this script, $Filename expands to an empty string while "$@" expands to a list of your command-line arguments. Please try it the way I suggested in the first place.
# 19  
Old 02-10-2015
Thanks a lot Don. Your script was not working in my environment but thanks a lot I learned a lot from you during this process. I finally wrote mine which is working fine now:

Code:
for f in $(find /home/u11/payments -type f)
do
echo comapring file now "$f" with $Filename
cmp -s $Filename $f > /dev/null
if [ $? -eq 1 ]; then
    echo is different    
else
    echo is not different
    echo Removing file now $f
    rm $f
fi
done

Moderator's Comments:
Mod Comment Please use CODE tags when displaying all sample input, output, and code segments.

Last edited by Don Cragun; 02-10-2015 at 06:53 PM.. Reason: Add CODE tags again.
# 20  
Old 02-11-2015
Quote:
Originally Posted by John William
Thanks a lot Don. Your script was not working in my environment but thanks a lot I learned a lot from you during this process. I finally wrote mine which is working fine now:

Code:
for f in $(find /home/u11/payments -type f)
do
echo comapring file now "$f" with $Filename
cmp -s $Filename $f > /dev/null
if [ $? -eq 1 ]; then
    echo is different    
else
    echo is not different
    echo Removing file now $f
    rm $f
fi
done

Moderator's Comments:
Mod Comment Please use CODE tags when displaying all sample input, output, and code segments.
This might work, but you're living dangerously...

The exit code from cmp is 0 if the files have the same contents, 1 if the contents are different, or some value greater than 1 if an error occurred. Your if condition is ignoring the error case and treating it as if the files compared equal when the comparison was not completed. (This might cause you to remove files that you couldn't compare.)

There is no need to redirect standard output from cmp -s since nothing is written to standard output when the -s option is present.

You might want to try this alternative (although I would still like to see a trace showing what failed in the script I suggested in post #10):
Code:
find /home/u11/payments -type f | while read -r f
do	printf 'Comparing file "%s" with "%s"...\n' "$f\" "$Filename"
	if cmp -s -- "$Filename" "$f"
	then	printf 'is not different\nRemoving "%s" now\n' "$f"
		rm -- "$f"
	else	echo 'is different or error encountered'
	fi
done

Using find ... | while read f allows the find command and the compare loop to run in parallel.

Using for f in $(find ...) requires the find command to complete before the compare loop starts.

Although your current filenames might not contain any spaces, tabs, or other characters special to the shell, quoting the expansions of $f and $Filename will keep your script running smoothly if conditions like that arise in the future. Similarly, preceding the file name operands to cmp and rm with -- protects against file names that might start with a minus sign (-) from being interpreted as options instead of as operands. And, the behavior of echo varies from system to system and shell to shell if the 1st operand given to echo starts with a minus sign or if any operand contains a backslash (\) character (both of which are possible from the expansions of $f and $Filename in your script). Using printf with a format string operand instead of echo avoids these possible problems.

Hope this helps...
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

Searching the file in a directory

Hi Folks, I am using the putty as I need to check the logs, My query is that I know the location of my logs ..that is cd /var /logs/abc.log so I can reach to this place and open the logs in putty, But what About if I do not the location only thing I know the name of the abc.log , and I have... (1 Reply)
Discussion started by: KAREENA18
1 Replies

2. Shell Programming and Scripting

Move all files not in a directory into a subdirectory named for each given file

Hi Everyone! Looking for some help with a script that will take all files in any given root folder (which are not already in a folder) and put them into separate folders with the name of each given file. Any ideas? Thank you! (1 Reply)
Discussion started by: DanTheMan
1 Replies

3. Shell Programming and Scripting

How can i find a word inside a file from a directory and it's subdirectory ?

Suppose i have a word "mail". I have to search this word in all files inside a directory and it's sub-directories. It will also search in all hidden directory and sub-directories. If it finds this word in any file it will list that file. How can i do this with perl/ruby/awk/sed/bash or... (9 Replies)
Discussion started by: cola
9 Replies

4. Shell Programming and Scripting

Copy file after searching in a directory

Hi, I am looking for an answer for following senario: I have a text file (base.txt) which consist list of files to be searched like: base.txt abc.txt def.txt fgh.txt Now i am going to search all the listed files in another directory after reading them one by one, once i found the... (10 Replies)
Discussion started by: apjneeraj
10 Replies

5. Shell Programming and Scripting

Sum of file size in directory / subdirectory

Hi , I am trying to write something to find the size of particular type of files in a directory & it's subdirectory and sum the size .. These types of file are found at directory level or its subdirectories level .. #!/bin/ksh FNAME='.pdf' S_PATH=/abc/def/xyz find $S_PATH -exec ls -lad... (4 Replies)
Discussion started by: Vaddadi
4 Replies

6. Shell Programming and Scripting

Shell script for searching a record,copy to a file and then delete it

Hi, I have a requirement in hand: I have a file with millions of records say file 1.I have another file, say file 2 which has 2000 records in it. The requirement is to read file2 , and remove the read record from file 1 and move i to a seperate file, file 3. For eg: Read file 2, get the... (5 Replies)
Discussion started by: kumara2010
5 Replies

7. UNIX for Dummies Questions & Answers

Create Year directory, date subdirectory and archive the file

Hi, After checking all the UNIX threads, I am able to come up with a solution so far. I am working on a shell script where it moves the files to a certain directory. The conditions to check are 1) Check if the file exists in the current directory. 2) Check if the destination directory... (2 Replies)
Discussion started by: madhunk
2 Replies

8. Shell Programming and Scripting

Find files including subdirectory and Delete

Hello Experts, I m newbie. Could u pls help me to write script on Sun solaris- I have backup directory "/var/opt/backup/" where files are backed up in different directory "backup1" "backup2" "backup3". I want to write a shell script which i will put in crontab and daily midnight it will... (1 Reply)
Discussion started by: thepurple
1 Replies

9. Shell Programming and Scripting

searching each file in a directory for text

what command can i use to search the files in a directory for a text. the output would list the files containing the text. ive tried this but it is not exactly what im looking to do: find . -name "*.xml" -exec agrep searchstring {} \; (2 Replies)
Discussion started by: jim majors
2 Replies

10. Shell Programming and Scripting

How to calculate file's size in directory and subdirectory

Hi, I have written one script to calculate total space of all file in one directory, ignoring subdirectory, it works fine. Now, I've been trying to calculate all files which includes files in any subdirectories. I use recursive function to do this, but it can work only if there is only one... (4 Replies)
Discussion started by: KLL
4 Replies
Login or Register to Ask a Question