Bash/Shell - paths with spaces messing things up

awk, bash, find

Solution

Awk's default separator is white space. Simply change it to something else by doing:

awk -F"\t" ...

Your script should look like:

dir=/path/to/destination/ | find /path/to/search -name file.txt | head -n 1 | awk -F"\t" -v dir="$dir" '{printf "cp \"%s\" \"%s\"\n", $1, dir}' | sh

As pointed by the comments, you don't really need all those steps, you could actually simply do (one-liner):

dir=/path/to/destination/ && path="$(find /path/to/search -name file.txt | head -n 1)" && cp "$path" "$dir"

Formated code (that may look better, in this case ^^):

dir=/path/to/destination/
path="$(find /path/to/search -name file.txt | head -n 1)"
cp "$path" "$dir"

The `""` are used to assign the entire content of the string to the variable, causing the separator `IFS`, which is a white space by default, not to be considered over the string.

Problem

I have a bash/shell function that is supposed to find files then awk/copy the first file it finds to another directory. Unfortunately if the directory that contains the `file` has spaces in the name the whole thing fails, since it truncates the path for some reason or another. How do I fix it? If file.txt is in /path/to/search/spaces are bad/ it fails. ``` dir=/path/to/destination/ | find /path/to/search -name file.txt | head -n 1 | awk -v dir="$dir" '{printf "cp \"%s\" \"%s\"\n", $1, dir}' | sh cp: /path/to/search/spaces: No such file or directory ``` *If file.txt is in /path/to/search/spacesarebad/ it works, but notice there are no spaces. :-/

Original source