Strange output from find


Login or Register for Dates, Times and to Reply

 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Strange output from find
# 1  
Strange output from find

How can I prevent find from outputting the directory name /home/xxxxxxxx/Backup/.system (which isn't even "other writable"?

I am trying to search for files that are "world writable" on a shared web host using the find statement, and I want to prevent find from creating an error (because the of directory permissions). I don't want to just pipe stderr to /dev/null as this would suppress unexpected errors.

This statement works correctly but produces an error"
Code:
# find /home/xxxxxxxx  -type f -perm -o+w
find: `/home/xxxxxxxx/Backup/.system': Permission denied

but for some reason the statement
Code:
find /home/xxxxxxxx -type d \( -iwholename "/home/xxxxxxxx/Backup/.system" \) -prune -o -type f -perm -o+w

creates the output
Code:
/home/xxxxxxxx/Backup/.system

i.e. it outputs the name of the directory excluded along with the files that are "other" writeable.

FYI
Code:
# ls -laR /home/xxxxxxxx/Backup/
/home/xxxxxxxx/Backup/:
total 12
drwxr-xr-x  3 xxxxxxxx xxxxxxxx 4096 Feb 15  2011 ./
drwx--x--- 31 xxxxxxxx nobody   4096 Aug 12 14:43 ../
drwx--x---  4 root     xxxxxxxx 4096 Feb 15  2011 .system/
/bin/ls: cannot open directory /home/xxxxxxxx/Backup/.system: Permission denied

the W bit is not set for "other", so I don't understand what is going on.
I am using find (GNU findutils) 4.4.2 on CentOS in case it matters.

How can I prevent find from outputting the directory name /home/xxxxxxxx/Backup/.system (which isn't even "world writable"?

As an aside, has anyone seen a good find tutorial? Man page does an OK job with the individual options, but really lacks the context for putting them together in combination
# 2  
Problem is you don't have a -print argument so all true expressions will print, including the prune.

Try:

Code:
find /home/xxxxxxxx -type d \( -iwholename "/home/xxxxxxxx/Backup/.system" \) -prune -o -type f -perm -o+w -print

This User Gave Thanks to Chubler_XL For This Post:
# 3  
Chubler_XL is correct. Here's the relevant bit from the POSIX documentation:

Quote:
Originally Posted by POSIX

If no expression is present, -print shall be used as the expression. Otherwise, if the given expression does not contain any of the primaries -exec, -ok, or -print, the given expression shall be effectively replaced by:

( given_expression ) -print
Regards,
Alister
This User Gave Thanks to alister For This Post:
# 4  
Quote:
Originally Posted by Chubler_XL
Problem is you don't have a -print argument so all true expressions will print, including the prune.

Try:

Code:
find /home/xxxxxxxx -type d \( -iwholename "/home/xxxxxxxx/Backup/.system" \) -prune -o -type f -perm -o+w -print

Thank you so much... that is exactly what I needed. Smilie

---------- Post updated at 03:02 PM ---------- Previous update was at 10:06 AM ----------

Quote:
Originally Posted by alister
Chubler_XL is correct. Here's the relevant bit from the POSIX documentation:
[code[Originally Posted by POSIX

If no expression is present, -print shall be used as the expression. Otherwise, if the given expression does not contain any of the primaries -exec, -ok, or -print, the given expression shall be effectively replaced by:

( given_expression ) -print
[/code]

Regards,
Alister
Thanks for the reply Alister... I've read it, and have a bit more of a clue, but the phrase given expression is what is confusing me. In the context of the find statement:
Code:
find /home/xxxxxxxx -type d \( -iwholename "/home/xxxxxxxx/Backup/.system" \) -prune -o -type f -perm -o+w -print

I'm really confused about that term given expression. It appears there are two expressions, one for include and one for exclude.

It appears that the order of processing is: -prune \(-type d \( -iwholename "/home/xxxxxxxx/Backup/.system" \) \), where the directory to prune comes before the prune statement rather than after it. Yet -type f -perm -o+w is processed Left to Right as I would normally expect.

I now understand that I can add to the pruned directories by adding as many -o -iwholename "/path/to/exclude" inside the brackets.

I'm still at a bit of a loss as to the correct way to add additional conditions to the find (i.e. modified within the last 10 days for example, or owned by user yyyyyyy).

Also does the "prune" expression need to be the first, or can the order of statement be reordered?

I'm in awe of the power and flexibility of (*)nix, (not many software systems from the 1970s are still in popular use) but the learning curve is steep and man pages are usually just for "a reminder" as they often include enough context for a newbe.

Any tips/input/reference to a good tutorial would be appreciated.

Thanks
# 5  
First of all, please forgive my bad English.
Something you've written sounds a bit odd to me.

First: my find is GNU find 4.2.2 too, but my man find is like this one:
UNIX man pages : find ()
and not like this one:
find.

In my find manual I can't read any "given expression", but I read clearly: "If the expression contains no actions other than -prune, -print is performed on all files for which the expression is true."

Second: the manual I linked above is pretty clear about what is an expression, how is it made up of options, tests and actions, and what's find behaviour depending on them being true or false. If you haven't read it yet, I suggest you give it a try. I'm sure it will be of some help.

Third: action -prune doesn't mean "ignore it", but "do not descend into it, if it is a directory". So a pruned directory found by find is printed itself (but its content is ignored) if the action -print (the default action) is performed.

Fourth: besides Chubler_XL solution, you could go with:
Code:
find /home/xxxxxxxx -type d -iwholename "/home/xxxxxxxx/Backup/.system" -prune , -type f -perm -o+w

(however you don't need any parenthesis).
This way the first expression, before the comma, is evaluated (-prune works), but its return values are then discarded: the directory /home/xxxxxxxx/Backup/.system is found by the first expression in which -prune gives a true return value for that directory, but this true value is then discarded, so only true return values of the second expression (after the comma) will cause something to be printed (default action).
--
Bye
Login or Register for Dates, Times and to Reply

Previous Thread | Next Thread
Thread Tools Search this Thread
Search this Thread:
Advanced Search

Test Your Knowledge in Computers #907
Difficulty: Easy
The Unix shell command line is a sequence of ASCII text words delimited by curly braces.
True or False?

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Echo's strange output

Hi, Kindly help me to understand the behavior or logic of the below shell command $ echo $!# echo $echo $ $ $ echo !$# echo $# 0 I am using GNU bash, version 3.2.25(1)-release (2 Replies)
Discussion started by: royalibrahim
2 Replies

2. UNIX for Advanced & Expert Users

Strange /etc/passwd output

Can someone please explain this to me? auser:x:500:500:Anne User:/home/auser:/bin/sh buser:x:501:501:Bob User:/home/buser:/bin/bash I'm used to it looking like this. What is the difference between the first name and second name? In the first case I had to use the first name to change my... (3 Replies)
Discussion started by: cokedude
3 Replies

3. UNIX for Advanced & Expert Users

strange output with du

Can someone please explain why I get two outputs with the du command? The first one gave me one. I also didn't ask for the second directory so why did it give that directory? $ du -h "/media/Part 1/Desktop/playlist" 775M /media/Part 1/Desktop/playlist $ du -h "/media/Part... (1 Reply)
Discussion started by: cokedude
1 Replies

4. Shell Programming and Scripting

Tcl:Very strange output!!

Hi, I using tcl script to perform certain conditions. Part of the results should have average . I couldn't figure out what 's the cause as the result of the average is Zero. Example of the case???? #!/usr/bin/tclsh set counter 500 set total 1000 puts "Total num: $total \n" puts ... (3 Replies)
Discussion started by: ENG_MOHD
3 Replies

5. Solaris

Strange df output on solaris 9

Hi all, After deleting some large log files on solaris 9 machine I can see strange df output shows below /dev/vx/dsk/rootvol 45G 16384E 50G 39879076698694% / I thought it will back to normal once I restart it but did not. I have seen in sunsolve article 6362734 that "Solaris 8... (0 Replies)
Discussion started by: rajashekar333
0 Replies

6. Solaris

Strange sar output

I was reviewing yesterday's sar file and came across this strange output! What in the world? Any reason why there's output like that? SunOS unixbox 5.10 Generic_144488-07 sun4v sparc SUNW,T5240 Solaris 00:00:58 device %busy avque r+w/s blks/s avwait avserv 11:20:01 ... (4 Replies)
Discussion started by: dangral
4 Replies

7. Solaris

Getting strange output of who -r command

Hi At OK> prompt, I have run the boot -s command After system is coming on to multiuser state, when I run the " who -r" command, I get the following message # who -r run-level Oct 17 03:48 last= Means I dont see "S" after run-level keyword. Could any one... (2 Replies)
Discussion started by: amity
2 Replies

8. Solaris

solaris 10 strange df output

hi, in solaris 10 SUN SPARC V245 server the following df -h output is showing . can i reuse the following disk space by deleting them /platform/sun4u-us3/lib/libc_psr/libc_psr_hwcap1.so.1 20G 5.2G 14G 27% /platform/sun4u-us3/lib/libc_psr.so.1... (2 Replies)
Discussion started by: phani.madiraju
2 Replies

9. Shell Programming and Scripting

strange output

I had a similar script in solaris and it had no problem. I wrote this one in freeBSD and it gave me strange output. Can anyone please tell me why? thanks a lot #!/bin/sh #This is a shell script that checks file system capacity mounted on /home directory #If file system is over 90% capacity,... (1 Reply)
Discussion started by: k2k
1 Replies

10. UNIX for Dummies Questions & Answers

Strange output from grep

Hi, I am getting different output for grep depending which directory I am in. The following is a transcript of my session, I am using egrep but have also used grep E. The directory names have been changed for security: $pwd /dir1/dir2/dir3/dir4 $echo 000000 |egrep -v $echo $? 1 $cd ..... (10 Replies)
Discussion started by: Bab00shka
10 Replies

Featured Tech Videos