8.12. Showing Nonprintable Characters in Filenames
From
time to time, you may get filenames with nonprinting characters,
spaces, and other garbage in them. This is usually the result of some
mistake -- but it's a pain nevertheless.
If you're using a version of
ls that
uses -q by default (and most do these days), the
ls command gives you some help; it converts all
nonprinting characters to a question mark (?),
giving you some idea that something funny is there.[36] For example:
% ls
ab??cd
This shows that there are two nonprinting characters between
ab and cd. To
delete (or rename) this file, you can
use a wildcard pattern like ab??cd.
WARNING:
Be careful: when I was new to Unix, I once accidentally generated a
lot of weird filenames. ls told me that they all
began with ????, so I naively typed rm
????*. That's when my troubles began. See
Section 14.3 for the rest of the gruesome
story. (I spent the next day and night trying to undo the damage.)
The moral is: it's always a good idea to use
echo to test filenames with wildcards in
them.
If you're using an ls that came
from System V Unix, you
have a different set of problems. System V's
ls doesn't convert the
nonprinting characters to question marks. In fact, it
doesn't do anything at all -- it just spits these
weird characters at your terminal, which can respond in any number of
strange and hostile ways. Most of the nonprinting characters have special
meanings -- ranging from "don't
take any more input" to "clear the
screen." [If you don't have a
System V ls, but you want this behavior for some
reason, try GNU ls with its -N
option. -- JP]
To prevent
this, or to see what's actually there instead of
just the question marks, use the
-b option.[37] This
tells ls to print the octal value of any
nonprinting characters, preceeded by a backslash. For example:
% ls -b
ab\013\014cd
This shows that the nonprinting characters have octal values 13 and
14, respectively. If you look up these values in an ASCII table, you
will see that they correspond to CTRL-k and CTRL-l. If you think
about what's happening -- you'll
realize that CTRL-l is a formfeed character, which tells many
terminals to clear the screen. That's why the
regular ls command behaved so strangely.
Once you know what you're dealing with, you can use
a wildcard pattern to delete or rename the file.
-- ML
 |  |  | 8.11. Can't Access a File? Look for Spaces in the Name |  | 8.13. Counting Files by Types |
Copyright © 2003 O'Reilly & Associates. All rights reserved.
|