Hi Rob,
rob@xxxxxxxxx wrote:
Ok, so we got the beginning of this
/FTP/GDI/EQUIPMENTVENDORS/FROMGDI/GermanyAssyLine/IRT - Walldurn.avi
being truncated to
./GDI/EQUIPMENTVENDORS/FROMGDI/GermanyAssyLine/IRT
figured out. We now still have two problems.
1 - Why did the end get truncated? Is ls or awk not handling spaces and
whatnot in the file name? If so, what's the workaround?
Generally speaking, Unix uses a space to delimit parameters on a
command-line. I suspect you have something like this:
find / -type f -size +40000 -exec ls -l {} \;
Each time it finds a file that's greater than 40000 blocks (20 MB) it'll
start a new background job, and run the following command in that
background job:
ls -l /FTP/GDI/EQUIPMENTVENDORS/FROMGDI/GermanyAssyLine/IRT - Walldurn.avi
The problem with that is that the "ls" program is actually receiving 4
parameters (not 2 as you intended).
parm1 = -l
parm2=/FTP/GDI/EQUIPMENTVENDORS/FROMGDI/GermanyAssyLine/IRT
parm3=-
parm4=Walldurn.avi
So it's trying to list three different files (one named IRT, one named
-, and one named Walldurn.avi) and it can't find them, thus the problem.
I don't understand why you're running "ls" from "find". Why not simply
pass the -ls switch to find, so that it doesn't have to spawn a
background job at all? Or doesn't the -ls option give you the data you
want? i.e., why not do this?
find / -type f -size +40000 -ls
Look at the manual for "find", and you'll see that -ls is an option
available, and it'll explain what kind of output you should expect.
(vs. running the ls command separately)
If you do want to execute the ls command in a separate process (I would
try to avoid that, personally), just put the filename in quotes so the
spaces won't be seen as parameter delimiters
find / -type f -size +40000 -exec ls -l "{}" \;
2 - Why did the dates get formatted sporadically?
Mar/04/2008
Jun/02/04:44
The long option (-l) of the ls command is not really intended to be
processed by a script. The date that's output is intended for a human
being.
For example, let's say two humans are talking (you & I) if I wanted to
tell you "I ran the cleanup procedure on May 31st, 2009" I probably
wouldn't say "May 31 2009", instead I'd probably say "I ran the cleanup
procedure on Sunday".
ls does the same sort of thing, to a degree. If it has been less than a
year since the date, it'll simply say the month, day and time (May 31
14:16) and not list the year, to save space. If it has been more than a
year, it'll list the year rather than the time "May 27 2007". Don't
expect the date format to be consistent, it's not intended to be.
If you like, I wrote a UDTF that returns the IFS filenames along with
attributes like dates, sizes, etc. The advantage to the UDTF is that
the output will be in a consistent format that should be easy to work
with (it uses the APIs rather than QShell) You can get it here:
http://systeminetwork.com/article/udtf-recursive-ifs-directories
With that, it should be an easy SQL statement:
Select t.Pathname, t.size, date(t.change_time)
from table(ifstree('/')) as t
where size > 20000000
Don't get me wrong the shell script method should work if you put enough
effort into it, I just think this way might be a little easier for you.
As an Amazon Associate we earn from qualifying purchases.