Copy files listed in a text file - whitespace problem.

Hi,

Say I have this text file <copy.out> that contains a list of files/directories to be copied out to a different location.

$ more copy.out
dir1/file1
dir1/file2
dir1/file3
"dir1/white space"
dir1/file4

If I do the following:

$copy=`more copy.out`

$echo $copy
dir1/file1 dir1/file2 dir1/file3 "dir1/white space" dir1/file4

$cp -v $copy ./temp
dir1/file4 -> ./temp/file4
cp: space": No such file or directory
cp: "dir1/white: No such file or directory
dir1/file3 -> ./temp/file3
dir1/file2 -> ./temp/file2
dir1/file1 -> ./temp/file1

All of the files managed to be copied except for the file with a whitespace.

I have tried using for loop, but the same thing happened.

$ copy=`while read line; do echo "$line"; done < copy.out`

$ echo $copy
dir1/file1 dir1/file2 dir1/file3 "dir1/white space" dir1/file4

$ cp -v $copy ./temp
dir1/file4 -> ./temp/file4
cp: space": No such file or directory
cp: "dir1/white: No such file or directory
dir1/file3 -> ./temp/file3
dir1/file2 -> ./temp/file2
dir1/file1 -> ./temp/file1

I edited copy.out and replace "dir1/white space" with dir1/white\ space but it didn't work. Just by simply removing the double quotes failed to work either. I understand that by using echo, it will flatten any whitespace in $variable into a single space, so I've tried using double quotes $variable, but again, it failed to copy the file with a whitespace.

I don't like whitespace in files/dirs name, but some people seem to like it, so I'd like to know how to fix this problem.

Any advice offered is appreciated.

Thanks.

$ cat copy.out
dir1/file1
dir1/file2
dir1/file3
dir1/white space
dir1/file4
$ while read file;do echo cp "$file" ./Newdir;done <copy.out
cp dir1/file1 ./Newdir
cp dir1/file2 ./Newdir
cp dir1/file3 ./Newdir
cp dir1/white space ./Newdir
cp dir1/file4 ./Newdir
$ (IFS=$'\n"';cp -v $(<copy.out) dir2)
`dir1/file1' -> `dir2/file1'
`dir1/file2' -> `dir2/file2'
`dir1/file3' -> `dir2/file3'
`dir1/white space' -> `dir2/white space'
`dir1/file4' -> `dir2/file4'

Remove the quotes from the name in copy.out, and change IFS to a newline:

IFS='
'
cp $( cat copy.out ) ./temp

danmero, radoulov, cfajohnson:

All solutions worked :smiley:

Thank you so much!