Paul L . Snyder on 29 Jun 2007 15:36:18 -0000


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

Re: [PLUG] delete unusual file name


On Thu, 28 Jun 2007, Mag Gam wrote:

> What about,
>
> find . -name "*thisfilewontdelete*" -exec rm {} \;
> (not tested, but I think you get the idea)

To sum up, three of the suggestions:

% rm \-foo
% rm "-foo"
% rm -i ?foo

will not work, because of the way the shell and UNIX option parsing are
designed.  First the shell mucks with your line by performing expansion
and so on, and then passes it to the program.  Wildcards like '*', for
example, are expanded by the shell so the program is supplied with a
list of files.  If you have a wildcard or other special character in the
filename, the first two work well.  (Note that this is not how DOS and
the Windows XP command interpreter work; on that platform, executables
must explicitly support wildcards.)  The third works well if you have a
file that has a non-printable character in the name that you can't type
on the keyboard.  The '-i' puts rm into "interactive" mode, so you get
prompted before deleting each file...always a good idea when using
wildcards.

'-' isn't a special character, so it is passed through to the program
unchanged.  It's the program's (in this case rm's) option parsing code
that's causing the problem.  It assumes that any character string after
a single dash is a list of single-character options, so

% rm -r -f foo
% rm -rf foo

are identical.  Any of those three command-lines, after having been
munged by the shell, are equivalent to

% rm -foo

and the GNU coreutils rm doesn't support a '-o' option, and the
command-line doesn't have a filename even if it did.  The other three
suggestions made in this thread work:

% rm ./-foo
% # works because the argument doesn't start with the '-' character.
% # This is actually suggested by rm on my system when I try to remove
% # a filename starting with a dash.

% find -name "*foo*" -exec rm {} \;
% # works because the command this generates is actually 'rm ./-foo'

% rm -- -foo
% # works with GNU coreutils rm because '--' tells the option parser
% # for rm to stop parsing options and interpret the rest of the
% # line as filenames.

Paul

___________________________________________________________________________
Philadelphia Linux Users Group         --        http://www.phillylinux.org
Announcements - http://lists.phillylinux.org/mailman/listinfo/plug-announce
General Discussion  --   http://lists.phillylinux.org/mailman/listinfo/plug