Dave, I purchased your Wicked Cool Shell Scripts book a month or so ago (great book), and have used it to “learn by example” in writing some shell scripts, as I’ve a long way to go in this area.
I need to rotate logs on an IBM AIX 5.1 Unix box, and tried using your script #55, rotatelogs for this but it didn’t work, as -maxdepth is not supported in AIX’s find command. So, I commented it out, and it worked, but also rotated everything in the subdirectories as well (no problem…backed up directory first, then restored). I am trying to get it to work using -prune which my search in Google found to be a good fix for the lack of maxdepth, but it’s not doing what I want. Help!
Hmmm… I don’t have access to an AIX Unix box, but are you sure that they don’t have a copy of GNU find tucked away somewhere on the box? Try using something like find / -name “find” -print as root to see if there’s more than one copy of the app on the system.
I’m not sure that -prune is what you want, though. Here’s what the find man page on my system says about it:
-prune This primary always evaluates to true. It causes find to not descend into the current file. Note, the -prune primary has no effect if the -d option was specified.
Is this a viable replacement for -maxdepth?
When I run it the output isn’t useful:
$ find . -prune -print . $
Hmmmm…. replacing the “.” with a “*” proves interesting (yes, I’m making the find more interesting too, just matching files that are non-zero in size):
$ find * -prune -type f -size +0c -print African Singing.aif Branding for Writers.doc GYBGCH12.doc KF BPlan-04-1123.doc Parent Night.aif Rahima Keynote.aif lumxtiger_outline final.doc master-adwords.pdf $
Maybe that’s what you need (ignore the specific files I have. You can see what I’m working on as this is my desktop. 😉
Try what I suggested, see what kind of results you get!
i had a problem with find command !! it also search for files to subfolders as below :
[root@omu-au213 ~]# find /var/tmp/test/ -name “*properties” -type f -exec ls -l {} \;
-rw-r–r– 1 root root 15 Dec 13 12:04 /var/tmp/test/1.properties
-rw-r–r– 1 root root 18 Dec 13 12:04 /var/tmp/test/2.properties
-rw-r–r– 1 root root 9 Dec 13 12:35 /var/tmp/test/test1/3.properties
i resolved the issue using maxdepth as below
[root@omu-au213 ~]# find /var/tmp/test/ -maxdepth 1 -name “*properties” -type f -exec ls -l {} \;
-rw-r–r– 1 root root 15 Dec 13 12:04 /var/tmp/test/1.properties
-rw-r–r– 1 root root 18 Dec 13 12:04 /var/tmp/test/2.properties
BUT this maxdepth does not work on AIX unit. please help me to find exactly the same output as (find /var/tmp/test/ -maxdepth 1 -name “*properties” -type f -exec ls -l {} \;) for AIX unit too.
For running find on a directory with many thousand files, the above command with “*” does not work, and fails with “The parameter or environment lists are too long.”.
Any easy alternative to this??
Thanks Dave, again. I was doing this on Solaris machine, no maxdepth also, using prune with -d option, wrong, the AIX help where it says, don’t use with -d, fixed the problem, works like charm now.
Well yes, you can do this:
find /tmp/* -prune
which limits the search to only the /tmp directory (no subdirs). However, “/tmp/*” is evaluated by the shell before being passed to “find” and could possibly exceed the maximum allowed length.
And while it is certainly possible to parse the output for the desired results, this does not stop the “find” command from needless searching. The find could be lengthy if the filesystem is large and/or over a network.
Without a “maxdepth” option, the best way to list all files in a given directory is:
(cd $DIR && find . ! -name . -prune)
Other options to “find” can be added as needed, and the parentheses can be removed if the changedir is not bothersome.
Some “creative” use of grep / sed / awk applied against the find output should allow you to select only to a (selected) depth; given a relatively stable structure, you might also be as well off by driving from a stored list of directories instead of “building on the fly”.
AIX find indeed does not have the -maxdepth flag option. The man page returns this for the -prune flag on my AIX 5.2 system. Only one find also, /usr/bin/find
-prune Always evaluates to the value True. Stops the descent of the current path name if it is a directory. If the -depth flag is specified, the -prune flag is ignored.