 |
 |
|
 |
|
 |
|  |
|  |
|
 |
|
 |
|  |
|  |
|
 |
Warp wrote:
> Why does it need to be so complicated?
> find /tmp/stuff -name "*.tmp" -exec rm {} \;
> It *does* work, assuming you have a sufficiently modern shell (and not
> a 20 years old sh). Modern shells are rather smart at escaping what needs
> to be escaped when you write "*".
In other words, if you completely bypass the shell, it can be made easy
to work. Otherwise you get things like "no such user John.tmp" when you
try to delete "~John.tmp". And if you want to delete all the files in
the directory, you have to add more escaping. And if you want to scp
them to a different server, you really don't want to be typing the
password for each one, so you either have to use xargs (with the -0
switch, which is why that's there!) or manage to tar them up somehow,
which has the same problems.
Anyway, my point was that it's kind of unobvious to get right, not that
it couldn't be done. I generally just break out Tcl for such a task
(since Tcl doesn't reparse things repeatedly without you asking
explicitly), as it's easier than trying to come up with the right list
of flags to the various programs.
Yet every time I mention the kinds of problems it causes, the UNIX
dweebs *I* know will fight to the death their need to be able to put
backspaces and vertical tab characters into file names. You might as
well try to convince a FORTH programmer that it isn't necessary to have
the ability to start the name of a function with a closing parenthesis.
</rant> :-)
Having the shell doing your expansion has caught me other times, too...
% cat a b c >d
Can't create d: permission denied
% sudo !!
Can't create d: permission denied
Of course, the real line was much longer, so a simple "su" meant
retyping the line (or using copy-and-paste to retype it for you) instead
of just !! or up-arrow. :-)
However, I'm glad Windows finally forced people writing Unix shells to
start dealing with funky file names as a regular occurrence. ;-) I
noticed that the shells started learning to do proper quoting (like for
command-line completion) right around the time SAMBA shares with
MSWindows servers got popular. :-)
--
Darren New / San Diego, CA, USA (PST)
"That's pretty. Where's that?"
"It's the Age of Channelwood."
"We should go there on vacation some time."
Post a reply to this message
|
 |
|  |
|  |
|
 |
|
 |
|  |
|  |
|
 |
Darren New <dne### [at] san rr com> wrote:
> In other words, if you completely bypass the shell, it can be made easy
> to work. Otherwise you get things like "no such user John.tmp" when you
> try to delete "~John.tmp".
Only if you write "~John.tmp" by hand instead of letting the shell do
the proper expansion.
> And if you want to delete all the files in
> the directory, you have to add more escaping.
Well, if "rm *" works (ie. there aren't too many files), you don't.
If there are too many files, I suppose you'll have to use the 'find'
trick.
> And if you want to scp
> them to a different server, you really don't want to be typing the
> password for each one
If you do a "scp *" it won't ask the password for each one.
>, so you either have to use xargs (with the -0
> switch, which is why that's there!) or manage to tar them up somehow,
> which has the same problems.
What's the problem with tarring them? "tar -cvf . files.tar"
> Anyway, my point was that it's kind of unobvious to get right
Granted, the only problem I have seen so far is when there are way
too many files in the directory, in which case "*" expand to too many.
However, I haven't seen any problems with special characters so far.
> Yet every time I mention the kinds of problems it causes, the UNIX
> dweebs *I* know will fight to the death their need to be able to put
> backspaces and vertical tab characters into file names.
The only valid point you have presented is the too-many-files argument,
which can be a real problem for the * expansion. So far I haven't seen
any real problem with special characters.
> Having the shell doing your expansion has caught me other times, too...
> % cat a b c >d
> Can't create d: permission denied
> % sudo !!
> Can't create d: permission denied
> Of course, the real line was much longer, so a simple "su" meant
> retyping the line (or using copy-and-paste to retype it for you) instead
> of just !! or up-arrow. :-)
What's wrong with getting the command from the command history with
the up cursor, going to the beginning of the line with ctrl-a and then
adding the "sudo" there?
> However, I'm glad Windows finally forced people writing Unix shells to
> start dealing with funky file names as a regular occurrence. ;-) I
> noticed that the shells started learning to do proper quoting (like for
> command-line completion) right around the time SAMBA shares with
> MSWindows servers got popular. :-)
Still many shell scripts fail to use the basic "$@" for the correct
expansion of all the parameters (and instead use $*, which is wrong).
Not all unix geeks know all the right tools either.
--
- Warp
Post a reply to this message
|
 |
|  |
|  |
|
 |
|
 |
|  |
|  |
|
 |
Darren New <dne### [at] san rr com> wrote:
> (I work with big directories, and big files. Often I'll have a program
> that runs 3 hours, then takes half an hour to delete its input files. Or
> individual files that take 2 minutes of disk I/O to delete. Or empty
> directories that take several minutes to delete because they used to
> have six or seven million files in em. And of course, the machine
> becomes completely unusable during any sort of operation like that.)
Isn't that a clear sign that a re-design of your programs is in place?-)
--
- Warp
Post a reply to this message
|
 |
|  |
|  |
|
 |
|
 |
|  |
|  |
|
 |
On Sat, 08 Mar 2008 14:51:02 -0800, Darren New wrote:
> Jim Henderson wrote:
>> On Sat, 08 Mar 2008 11:54:07 -0800, Darren New wrote:
>>
>>> Here's a contest. Given the directory /tmp/stuff, delete all the files
>>> in that directory that end with ".tmp".
>>
>> cd /tmp/stuff; find -type f | grep tmp$ | awk '{system("rm \"" $0
>> "\""))'
>
> Great. Now try it on a directory with the following names in it:
>
> -rf\n.tmp (where the \n means newline, of course) <.tmp
> .xyz.tmp
> hip"hop.tmp
> hop'hip.tmp
> this.tmp;that.tmp
> this\bthat.tmp (where the \b means bell) this\bthat.tmp (where the
> \b is two characters, backslash and b)
>
> Two for zero... ;-)
I *think* if I were to do a single quote rather than a double, that would
solve most of those problems. Maybe not the one with the single tick in
it, but a gsub for a pattern of special characters would do it.
But of course, I try not to name files with special characters - not
always successfully (occasionally torrents that I pull down have names
that are stupidly in violation of all standards for file naming).
But if I wanted it to work all the time, I'd write it in C and be done
with it - then the shell doesn't come into play. :-)
> (I work with big directories, and big files. Often I'll have a program
> that runs 3 hours, then takes half an hour to delete its input files. Or
> individual files that take 2 minutes of disk I/O to delete. Or empty
> directories that take several minutes to delete because they used to
> have six or seven million files in em. And of course, the machine
> becomes completely unusable during any sort of operation like that.)
I occasionally do things like this myself - that's the reason I didn't
try to pass all the files on the command-line to a single rm command.
BTDTGTTS. :-)
Jim
Post a reply to this message
|
 |
|  |
|  |
|
 |
|
 |
|  |
|  |
|
 |
On Sat, 08 Mar 2008 17:44:45 -0500, Warp wrote:
> Jim Henderson <nos### [at] nospam com> wrote:
>> cd /tmp/stuff; find -type f | grep tmp$ | awk '{system("rm \"" $0
>> "\""))'
>
> Why does it need to be so complicated?
>
> find /tmp/stuff -name "*.tmp" -exec rm {} \;
Because there's a million ways to do it, and I haven't memorised all the
options for the find command.
In the time that it would take me to look up the options for find, I've
written the command-line out.
Jim
Post a reply to this message
|
 |
|  |
|  |
|
 |
|
 |
|  |
|  |
|
 |
Jim Henderson escribió:
> But if I wanted it to work all the time, I'd write it in C and be done
> with it - then the shell doesn't come into play. :-)
Can filenames have null characters on them? :)
Post a reply to this message
|
 |
|  |
|  |
|
 |
|
 |
|  |
|  |
|
 |
Orchid XP v7 wrote:
> Chambers wrote:
>
>> So what you're really saying, is that we need a modern implementation
>> of traditional Unix style tools, distributed as a package. It
>> wouldn't need a ton of that backwards-compatibility stuff, because all
>> of the included tools are fresh implementations that we know work
>> together.
>
> What I'm saying is that "Unix" isn't a single coherant design. It's
> 50,000 random people all doing their own seperate thing, and expecting
> the result to actually function. Which, almost unbelievably, it does.
> But *damn* is it messy...
When you're writing a single, simple tool, with well defined inputs and
outputs, it's much easier to make it work *no matter what*. When each
tool is maintained by a separate group of people, they may not share the
same design ideology, but they're much more likely to operate correctly
under unexpected circumstances.
So the fact that it works as often as it does shouldn't really surprise
anyone.
--
...Ben Chambers
www.pacificwebguy.com
Post a reply to this message
|
 |
|  |
|  |
|
 |
|
 |
|  |
|  |
|
 |
On Sun, 09 Mar 2008 00:11:49 -0200, Nicolas Alvarez wrote:
> Jim Henderson escribió:
>> But if I wanted it to work all the time, I'd write it in C and be done
>> with it - then the shell doesn't come into play. :-)
>
> Can filenames have null characters on them? :)
A null character can be represented as a value, so yes.
Jim
Post a reply to this message
|
 |
|  |
|  |
|
 |
|
 |
|  |
|  |
|
 |
Darren New wrote:
>
> % cat a b c >d
> Can't create d: permission denied
> % sudo !!
> Can't create d: permission denied
>
> Of course, the real line was much longer, so a simple "su" meant
> retyping the line (or using copy-and-paste to retype it for you) instead
> of just !! or up-arrow. :-)
>
<up arrow><home>su -c <enter>
--
Eero "Aero" Ahonen
http://www.zbxt.net
aer### [at] removethis zbxt net invalid
Post a reply to this message
|
 |
|  |
|  |
|
 |
|
 |
|  |
|  |
|
 |
Jim Henderson <nos### [at] nospam com> wrote:
> On Sat, 08 Mar 2008 17:44:45 -0500, Warp wrote:
> > Jim Henderson <nos### [at] nospam com> wrote:
> >> cd /tmp/stuff; find -type f | grep tmp$ | awk '{system("rm \"" $0
> >> "\""))'
> >
> > Why does it need to be so complicated?
> >
> > find /tmp/stuff -name "*.tmp" -exec rm {} \;
> Because there's a million ways to do it, and I haven't memorised all the
> options for the find command.
> In the time that it would take me to look up the options for find, I've
> written the command-line out.
But now you know. The -exec option of find is actually quite useful.
Learn to use your tools. :)
--
- Warp
Post a reply to this message
|
 |
|  |
|  |
|
 |
|
 |
|  |
|
 |