first of misc questions....

Garrett Cooper youshi10 at u.washington.edu
Thu Apr 26 10:15:10 UTC 2007


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


More information about the freebsd-questions mailing list