I understand that one technique for dealing with spaces in filenames is to enclose the file name with single quotes: "'".
Why is it that the following code called, "echo.sh" works on a directory containing filenames with spaces, but the program "ls.sh" does Not work, where the only difference is 'echo' replaced with 'ls'?
echo.sh
#!/bin/sh
for f in *
do
echo "'$f'"
done
Produces:
'a b c'
'd e f'
'echo.sh'
'ls.sh'
But, "ls.sh" fails:
#!/bin/sh
for f in *
do
ls "'$f'"
done
Produces:
ls: cannot access 'a b c': No such file or directory
ls: cannot access 'd e f': No such file or directory
ls: cannot access 'echo.sh': No such file or directory
ls: cannot access 'ls.sh': No such file or directory
you're actually adding redundant "'" (which your echo invocation shows)
try this:
Taking a closer look at the output of your echo.sh script you might notice the result is probably not quite the one you expected as every line printed is surrounded by
'
characters like:and so on.
Files with that names really don't exist on your system. Using them with
ls
ls will try to look up a file named'file-1'
instead offile-1
and a file with such a name just doesn't exist.In your example you just added one pair of
'
s too much. A single pair of double quotes"
is enough to take care of spaces that might contained in the file names:Will work pretty fine even with file names containing spaces. The problem you are trying to avoid would only arise if you didn't use the double quotes around
$f
like this:What about this ? =)
change the following line from
into