[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[ale] THANKS to all who replied to "ls -rt | rm -i" problem, BUT...ATTN:JoeKnapka



On 3/19/06, Geoffrey <esoteric at 3times25.net> wrote:
> Paul Cartwright wrote:
> > On Sun March 19 2006 7:54 am, Geoffrey wrote:
> >
> >> awk is the toy you want:
> >>
> >> rm -i $(ls -l | awk '/Mar 15/ {print $NF})
>
> Well, I've played around with it a bit, but it's a bit uglier then I
> expected.  There's no easy way to escape the spaces in a file name with
> awk in such a way that 'rm -i' will be happy.
[snip]
>
> Problem is, 'rm -i' sees the filename as two different files when passed
> as in 'rm -i $(...)'
>
> I can pipe the output of the script to xargs, but xargs doesn't wait for
> a response to rm -i, thus that doesn't work either.

The trick is to use eval. If you change your awk script slightly:

ls -l |awk '/Mar 15/ {
    if (NF == 9) { print $NF }
    else {
        for (i=9; i<=(NF - 1); i++) {
            printf "\"%s ", $i; } printf "%s\"\n", $NF; # note quotes
at start and end of filename
    }
}'

and then run rm like this:

eval rm -i $(awkScriptNameHere)

you'll be able to remove those annoying spacey filenames.  At least
that works with bash; I didn't try it with other bourne-type shells. 
Note that this will still fail if you somehow get tabs or newlines (or
other weird $IFS characters you might have) in your filenames, as the
awk script makes an assumption that only (single) spaces are used as
field separators.

A simpler approach that's pretty well guaranteed to work (unless you
have newlines or double-quotes in your filenames) is to use sed:

eval rm -i $(ls -l|sed -n -e 's/$/"/' -e 's/.* Mar 15 [^ ]* /"/p')

The order of the two sed expressions is important, as you only want to
print the lines that match the date string in the second one.