Remove file called "-X"??

Hi all,

So I have found a file literally called "-X" in a folder, that is preventing me from using any meaningful commands in that folder because, as I understand it, at command runtime it will convert any wildcard characters into matching filenames, thus a command such as:

ls *

Ends up actually doing:

ls -X

Because the -X file is the first one in the folder...which is not a valid argument for ls. And thats what SunOS tells me. This happens with every command I've tried so far. The nature of this problem has also made it difficult for me to google for answers, so I'm hoping someone here can help me with an explanation or a way to rename this file! Here's some examples of my troubles:

root@qmgt2 # ls -al
total 3695918
-rw-r-----   1 root     other    1771857920 Nov 14  2006 -X
dr-xr-xr-x  22 bin      bin          512 Mar 29  2010 .
drwxr-xr-x  48 root     root        2048 Feb 24 12:41 ..
drwxr-x---   2 root     other        512 Mar  9  2005 APP_BACKUPS
drwxr-xr-x   6 root     other        512 Sep 22  2004 ORCLfmap
dr-xr-xr-x  37 bin      bin         1024 Mar 29  2010 OV
drwxr-xr-x   3 root     bin          512 Sep 20  2004 SUNWits
drwxr-xr-x   5 root     sys          512 Sep 20  2004 SUNWrtvc
drwxr-xr-x   3 root     other        512 Sep 24  2004 VRTSvcs
drwxr-xr-x   3 netcool  ncoadmin     512 May 26  2009 alu
drwxr-x---   3 root     other        512 Apr  4  2005 backups
drwxrwxrwx   2 root     other        512 Sep 22  2004 bin
drwxr-x---   3 root     other        512 Mar 29  2010 cfgdwn
drwxr-xr-x   5 root     sys          512 Jun 12  2008 dcelocal
-rw-r-----   1 root     other         25 Nov 15  2006 exclude
-rw-r-----   1 root     other       1243 Nov 14  2006 exclude.txt.new
-rw-r-----   1 root     other       2809 Nov 15  2006 exclude.txt.old
drwx------   2 root     root        8192 Sep 20  2004 lost+found
drwxr-x---   3 root     other        512 Feb 23  2005 mnams
-rw-r-----   1 root     other    39992320 Sep 17  2007 mnams.tar
drwxr-x---   3 root     other        512 Mar  2  2005 msg
drwxr-xr-x   4 root     other        512 Nov 10  2009 netcool
-rw-r-----   1 root     other    79429147 May 28  2007 netcool.tar.gz
drwxr-xr-x  12 netcool  ncoadmin     512 May 26  2009 netcoolnsa
drwxr-x---   2 root     other        512 Sep  7  2005 oracle
dr-xr-xr-x  12 bin      bin          512 Jun 12  2008 perf
drwxr-xr-x   3 root     bin          512 May 27  2005 sfw
drwxr-x---   2 root     other      28672 Apr  4  2010 tmp
root@qmgt2 # ls *
ls: illegal option -- X
usage: ls -1RaAdCxmnlhogrtucpFbqisfL@ [files]
root@qmgt2 # du -sk * | sort -n
du: illegal option -- X
usage: du [-a] [-d] [-h|-k] [-r] [-o|-s] [-L] [file ...]
root@qmgt2 # tail -X
usage: tail [+/-[n][lbc][f]] [file]
       tail [+/-[n][l][r|f]] [file]
root@qmgt2 # tail "-X"
usage: tail [+/-[n][lbc][f]] [file]
       tail [+/-[n][l][r|f]] [file]
root@qmgt2 # mv -X new.dat
mv: illegal option -- X
mv: Insufficient arguments (1)
Usage: mv [-f] [-i] f1 f2
       mv [-f] [-i] f1 ... fn d1
       mv [-f] [-i] d1 d2
root@qmgt2 # mv "-X" new.dat
mv: illegal option -- X
mv: Insufficient arguments (1)
Usage: mv [-f] [-i] f1 f2
       mv [-f] [-i] f1 ... fn d1
       mv [-f] [-i] d1 d2
root@qmgt2 # mv '-X' new.dat
mv: illegal option -- X
mv: Insufficient arguments (1)
Usage: mv [-f] [-i] f1 f2
       mv [-f] [-i] f1 ... fn d1
       mv [-f] [-i] d1 d2
root@qmgt2 # mv *X new.dat
mv: illegal option -- X
mv: Insufficient arguments (1)
Usage: mv [-f] [-i] f1 f2
       mv [-f] [-i] f1 ... fn d1
       mv [-f] [-i] d1 d2

I've never encountered this before. Something tells me that there is something special about this -X "file"... besides it being a royal PITA. :mad:

It has to do with how your shell expands the command.

Try this, assuming you're in the same directory as the file:

# mv ./-X ./dash-X

Then you can examine or remove the 'dash-X' file.

1 Like

sweet, that did the trick. Although I still had issues viewing the file because of the - inside the name, so I just renamed it again to new.dat using your syntax above, and now tail doesn't complain.

Thanks for this!:b:

In general, when dealing with arguments which look like options, you can use a double dash to signal the end of options:

command -o1 -o2 -- -X

In that case, -o1 and -o2 are two option-arguments to command. -- signals the end of options. Since -X appears after --, it is not considered an option-argument even though it begins with a dash.

One way to create that file and then remove it:

touch -- -X
rm -- -X

Regards,
Alister

alister makes a good point - many utilities do have such an option. Not all do, though, which is why I suggested the course I did - it's fairly portable.

This subject is a common one, though. I've even heard of people doing this on purpose to act as a safety mechanism, although I wouldn't ever do so myself:

$ mkdir garbage && cd garbage
$ touch file{1..5}
$ touch ./-i
$ rm *
rm: remove regular empty file `file1'? n
rm: remove regular empty file `file2'? n
rm: remove regular empty file `file3'? n
rm: remove regular empty file `file4'? n
rm: remove regular empty file `file5'? n
$ 

The "*" is expanded by my shell as "-i file1 file2 file3 file4 file5", so rm takes the -i as an option to prompt interactively just in case you do something silly like "rm *". It's bad practice, in my mind anyway, to rely on such, but to each their own.

Check your manpages to see if your utilities accept "--" to stop processing arguments. If so, it's a good habit to get in using, especially when scripting.

Before Remove/Renaming you have go to that path where the file "-X" is located.
otherwise replace full path instead of "./"

For Remove:
------------

rm ./-X

For Rename:
------------

mv ./-X newfile

the "--" thing works most of the time for me too.
alternatively, for really weird filenames, action through "inode" does the trick.

$ touch -- --d
$ ls -ilrt | grep -- --d
 90779 -rw-r--r--   1 user1   grp1         0 Mar 15 14:10 --d
$ find . -inum "90779"
./--d
$ find . -inum "90779" -exec mv {} recovered \;
$ ls -li recovered
 90779 -rw-r--r--   1 user1   grp1         0 Mar 15 14:10 recovered
$ 

Hm, interesting. That could be how it came to be, I am working on some pretty sensitive equipment - stuff this box up and 80% of Australians can't send/recv SMS! :rolleyes:

Well, I'm pretty sure it's got redundancy but I'd hate to find out the hard way...