Nested find cmd


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Nested find cmd
# 1  
Old 03-17-2011
Nested find cmd

Hi gurus, greetings.

Objective: find in a path directories that are named Logs. In each found Logs dir search for files with .log extension and remove -atime +6. (Note for test/example, rm and -atime is not used).

Issue: If I execute the script without redirecting output to a file, on stdout gives me what I expect to see. Redirecting it to an out put file results in output file having result of last iteration as well as ls -l of the directory where this script resides.

Disclaimer: I know that I am doing something silly here but cannot pin point.

Code:
#! /bin/sh
out=/usr/tmp/ct
 for DIR in `find /opt/sample -type d -name Logs 2>/dev/null`
   do
   echo "****** Dir Name: $DIR ********" > $out
   find $DIR -type f -name "*.log" |xargs ls -l >> $out  #for testing not using rm and -atime and using ls -l
  done
 
cat $out  #for testing

Thank you in advance. I know that I need to do the search and sub searc on iteration basis, have been searching threads here and even used some suggestion but I am failing to correctly construct a do routine.

Any and all help is deeply appreciated.
# 2  
Old 03-17-2011
That's a useless use of backticks, whenever you have "for x in `something`" it's often better to do "something | while read x".

Code:
find /opt/sample -type d -name Logs |
while read DIR
do
        find "$DIR" -type f -name "*.log" -atime +6
done

should print the matching files.

Are you sure atime is what you want? That's when files were last accessed, not when last modified, and many systems don't keep atimes these days.
This User Gave Thanks to Corona688 For This Post:
# 3  
Old 03-17-2011
Well, no space after #!, you truncate the output for every DIR, xargs will fire for 0 found, so try -n999, and while read DIR' would be lower latency:
Code:
#!/bin/sh
out=/usr/tmp/ct
 
find /opt/sample -type d -name Logs 2>/dev/null | while read DIR
 do
  echo "****** Dir Name: $DIR ********"
  find $DIR -type f -name "*.log" |xargs -n999 ls -l #for testing not using rm and -atime and using ls -l
  done | tee $out

find -atime seems a flaky condition; usually people go by -mtime, or simpler yet, robust, testable and accurate: "-newer $marker_file" like this:
Code:
touch $marker_file.new
sleep 1
... -newer $marker_file
mv $marker_file.new $marker_file

This User Gave Thanks to DGPickett For This Post:
# 4  
Old 03-17-2011
Hi there and thank you Corona688 and DGPicket for your time and advice.

I tried both suggestions. There are two things occurring:
1. stdout does show per dir listing of .log files, however, the last two in iteration also show a ls -l of the directory where this script is saved. Very odd.
Code:
#!/bin/sh
out=/usr/tmp/ct
  find /opt/sample -type d -name "Logs" 2>/dev/null | while read DIR
    do
      echo "****** Dir Name: $DIR ********"
      find $DIR -type f -name "*.log" |xargs -n999 ls -l
    done|tee $out

OS is Linux.

Noted your advice Corona. Also, will change the -atime. DG, your newer file example went way over my head Smilie
# 5  
Old 03-17-2011
Quote:
Originally Posted by rsheikh
1. stdout does show per dir listing of .log files, however, the last two in iteration also show a ls -l of the directory where this script is saved. Very odd.
I think that means xargs didn't find any arguments and just ran ls -l by itself. -n999 doesn't actually stop this from happening, it only sets a maximum number of args, so seems a bit pointless.

xargs can also react badly to spaces in filenames since it takes any whitespace as the separator. You can force it to use newlines only with -d '\n' but the preferred solution, in Linux, would be to use find -print0 and xargs --null. like find "$DIR" -type f -name "*.log" |xargs ls -l Also note the extra quotes around $DIR. If there were any spaces in it, the quotes would stop it from splitting into two or more arguments.

Last edited by Corona688; 03-17-2011 at 05:10 PM..
This User Gave Thanks to Corona688 For This Post:
# 6  
Old 03-17-2011
How about nesting it in a single line...
Code:
find /opt/sample -type d -name "Logs" -exec find {} -type f -name "*.log" -atime +6 \; | xargs rm

This User Gave Thanks to shamrock For This Post:
# 7  
Old 03-21-2011
Hi all and thank you for your valuable suggestions. I learned quite a bit.

I played around and made some changes in the search routine to check if dir is empty or not and used the following in my code and it is working as I liked:
Code:
 
out=/usr/tmp/ct
find /opt/sample -type d -name "Logs" 2>/dev/null | while read DIR
   do
     if [ "$(ls $DIR)" ]
        then
            find "$DIR" -depth 0 -type f -name "*.log" -print0 2>/dev/null |xargs -r ls -l >> $out
      fi
   done

Once I am done testing I will add the -mtime option in my search feature as suggested.

Once again, thank you.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Advanced & Expert Users

Find cmd and sym links

Hi. Can somebody tell me if there's a way of creating a symbolic link from a directory on one filesystem to that on another that will allow a find command that doesn't use the -L param to locate a particular file under that new 'linked' dir. With a normal sym link the find command on that... (6 Replies)
Discussion started by: user052009
6 Replies

2. UNIX for Dummies Questions & Answers

Help with the find cmd

Hello, I'm having a trouble with the find cmd. I would like to find all the java versions on my systems. I have solaris 9 & 10 RHEL and SUSIE. java -version doesn't give all the versions on the server. So I am trying to use the find command to find them all find / -name java I would... (7 Replies)
Discussion started by: bitlord
7 Replies

3. Shell Programming and Scripting

find cmd works different on cron job ?

/usr/bin/find $SEARCH_DIR -daystart \( \( -name 'KI*' -a -name '*.csv' \) -o -name '*_xyz_*' \) -mtime $DAYS_AGO -printf %f -printf "\n" | sort -r > $FILES The above command gives different results when run on a cron job. When run manually the result is accurate. (2 Replies)
Discussion started by: nuthalapati
2 Replies

4. Shell Programming and Scripting

How to link lsof and find cmd?

Hi All, My target is to find the biggest files opened by any process and from that i have to find process id and the corresponding file also to avoid file system being hung-up. Finding the process id: is to kill the process Finding the biggest file: is to remove the file To get the process... (0 Replies)
Discussion started by: Arunprasad
0 Replies

5. Shell Programming and Scripting

date with find cmd

Hi for today i have 10 files, in that i need search some values how can i write a find cmd with perticular date thanks SAIC (4 Replies)
Discussion started by: saic
4 Replies

6. Shell Programming and Scripting

Find cmd not working correctly in script

I am trying to copy 2 types of files so I can archive them. I tested with a set of commands: touch -t $(date -d "-60 day" +%Y%m%d) WORKDIR/REF find TARGETDIR/ -type f -maxdepth 1 -iname \*.out\* -or -iname \*.log\* ! -newer WORKDIR/REF -exec ls -l {} \; This correctly lists any files in the... (2 Replies)
Discussion started by: prismtx
2 Replies

7. Shell Programming and Scripting

how to find status of last executed cmd in perl?

In shell we can find the status of last executed command by $? In perl what is the command to find the status of last executed command... Can any one please say??????????????? Thanks, Prabhu (1 Reply)
Discussion started by: prsampath
1 Replies

8. Shell Programming and Scripting

using find cmd to find certain files

i have a list of files below: rwxrwxrwx 1 pipe pipe 180 Mar 4 22:47 del_0n_Date -rwxrwxrwx 1 pipe pipe 472 Mar 4 22:58 mail_Check -rw-r--r-- 1 pipe pipe 92 Mar 4 22:58 minfo.txt -rwxrwxrwx 1 pipe pipe 609 Mar 5 05:12... (6 Replies)
Discussion started by: ali560045
6 Replies

9. Solaris

Find cmd working in Linux and not in SunSolaris 5.8

find . -type f -mtime -1 -ls command not working in sun solaris 5.8 (4 Replies)
Discussion started by: navjotbaweja
4 Replies

10. Shell Programming and Scripting

Find cmd not working as expected

Hi, i wan to search the file starting with Admin into the directory Output. I am running below command: find /appl/Output -name "Admin*" -prune but this command is going into the sub directories present under output. I do not want to search under sub directories. Any help will be highly... (6 Replies)
Discussion started by: Vishal123
6 Replies
Login or Register to Ask a Question