Question: I am trying to write a bash script to list the size of each file/subdir of the current directory, as follows:

```
for f in $(ls -A)
do
    du -sh $f
done

```

I used `ls -A` because I need to include hidden files/dirs starting with a dot, like `.ssh`. However, the script above cannot handle spaces if the file names in `$f` contain spaces.
e.g. I have a file called:

```
books to borrow.doc

```

and the above script will return:

```
du: cannot access `books': No such file or directory
du: cannot access `to': No such file or directory
du: cannot access `borrow.doc': No such file or directory

```

There is a similar question [Shell script issue with filenames containing spaces](https://stackoverflow.com/questions/15511006/), but the list of names to process is from expanding `*` (instead of `ls -A`). The answer to that question was to add double quotes to `$f`. I tried the same, i.e., changing 

```
    du -sh $f

```

to 

```
    du -sh "$f"

```

but the result is the same. My question is how to write the script to handle spaces here?

Thanks.

Answer: 
Dont parse the output from `ls`. When the file contains a space, the `$f` contains the parts of teh filename splitted on the space, and therefore the double quotes doesn't got the whole filename

The next will work and will do the same as your script

```
GLOBIGNORE=".:.."  #ignore . and ..
shopt -s dotglob   #the * will expand all files, e.g. which starting with . too
for f in *
do
    #echo "==$f=="
    du -sh "$f"  #double quoted (!!!)
done

```
Try this:

```
    ls -A |
    while read -r line
    do
    du -sh "$line"
    done

```

Instead of checking for the `ls -A` output word by word, the while loop checks line by line.
This way, you don't need to change the IFS variable.