Gary Kline wrote:
On Wed, Apr 25, 2007 at 08:49:56AM +0100, Matthew Seaman wrote:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: RIPEMD160

Gary Kline wrote:
        Guys,

        This is an awk-type question.  Hopefully a one-liner.  If I
        need to use #!/usr/bin/awk and a BEGIN/END (or whatever it is),
        that's okay...

        I want to do an ls -l in a  /home/kline/<directory> and find and
        edit files that are dated (let's say) Apr 19 or Mar 26.  This
works to print $9 the filenames.
         ls -l| awk '{if ($6 == "Apr" && $7 == 19  || $6 == "Mar" && $7
         == 26 ) print $9}'

         What's the final part to get awk to vi $9?  Or another pipe and
         xargs and <what> "vi"?  Nothing simple works, so thanks for any
         clues!

xargs(1) is your friend.

Simply arrange for your awk script to print out the names of all the
files you have selected to edit, then pipe the result into xargs.
Like so:

ls -l| awk '{if ($6 == "Apr" && $7 == 19  || $6 == "Mar" && $7 == 26 )
print $9}' | xargs vi


        Doing a pipe thru "xargs vi" is the first thing that
        failed--with:

ex/vi: Vi's standard input and output must be a terminal


whereas
         ls -l| awk '{if ($6 == "Apr" && $7 == 19  || $6 == "Mar" && $7
== 26 ) print $9}'

printed a slew of files to stdout.
This does assume that the file names you are using do not contain
spaces, quote marks, brackets or other characters of syntactical
significance to the shell.  In that case you could use something like
this:

   find . -type f \( -mtime 6 -o -mtime 29 \) -print0 | xargs -0 vi


        No, no non-ASCII characters in the filenames.  I'll try the -0
        and see if that gets rid of the "must be a terminal" blurb...


ph 11:47 <tao> [5133] ls -l| awk '{if ($6 == "Apr" && $7 == 19  || $6 ==
"Mar" && $7 == 26 ) print $9}' | xargs  -0 vi
ex/vi: Files with newlines in the name are unrecoverable
ex/vi: Modifications not recoverable if the session fails
ex/vi: Vi's standard input and output must be a terminal


        Ah, so vi sees "filename\n" ... perhaps.  [?]




where find's '-print0' and the '-0' flag to xargs make the commands
produce and consume respectively a null separated list of filenames.

Unfortunately with find(1) there doesn't seem to be a way of expressing
an absolute date / time -- all you can do is the time difference between
now and when you want (which defaults to 'number of days' but can be set
to use various other time units.  I can think of a couple of ways of
calculating that, but personally I'd find it cleaner to just roll the
whole thing into a small perl script which identified the files in
question and forked off an instance of vi(1) to do the editing.



        You're probably right about the script.  There are at least
dozens of files around ... they could be /bin/mv'd or cp'd to a tmp and then run thru vi. --Or??

        thanks much, Matthew.  appreciate it,

        gary


        Cheers,

        Matthew

- --
Dr Matthew J Seaman MA, D.Phil.                       Flat 3
                                                      7 Priory Courtyard
PGP: http://www.infracaninophile.co.uk/pgpkey         Ramsgate
                                                      Kent, CT11 9PW, UK
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.3 (FreeBSD)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFGLwgk3jDkPpsZ+VYRAxaaAJ9H4q3vD4qqBo+FijEs+PqmaR0kaQCgidpA
kXOmJIpsODutFhLIvIoJpEE=
=fNoc
-----END PGP SIGNATURE-----


Or my favorite structure (bourne shell style)..

for i in `ls -l | awk '{if ($6 == "Apr" && $7 == 19 || $6 == "Mar" && $7 == 26 ) print $9}'`; do vi $i; done

Could you provide examples of what you are trying to edit though Gary?

Thanks,
-Garrett
_______________________________________________
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to