The '[' and ']' are one examples of special characters that your shell (probably bash) tries to interpret unless you tell it not to. '{' and '}' are another example: to clarify this, the following two lines would be equivalent
Code:
ls file{1,2}.abc
ls file1.abc file2.abc
There are a lot of things like this - special ways to tell your shell's interpreter to do something "handy". The cost is that some characters are then interpreted in a special manner, and if they exist in a filename (they can exist there, it's just fine because it wouldn't be fair to disallow such filenames just because one shell couldn't deal with them) you need to tell the interpreter that it's part of a filename, not a "special command".
To tell bash, for example, that a string you type is a filename with possibly special characters inside and not a sequence of characters with some "command characters" to be interpreted, you can use (at least) two ways. One was described above: escape each "special" character with a leading slash:
Code:
cp \[file\].abc anotherfile.abc
cp file\ name\ with\ spaces\ in\ it.abc some\ other\ name.abc
The other way is to put (double-)quotation marks around the filename, which has the same effect:
Code:
cp "[file].abc" anotherfile.abc
cp "file name with spaces in it.abc" "some other name.abc"
At least in most cases the latter works, and is often a lot shorter to use. Especially with filenames with spaces it's more handy to type two quotation marks than a dozen slashes.
More:
and a few good websites. See linuxcommand.org for a start.