Bash / Escaping quotes is driving me crazy . .

Gordon Messmer gordon.messmer at gmail.com
Sun Feb 21 00:40:01 UTC 2016


On 02/20/2016 04:05 PM, Philip Rhoades wrote:
> . . but why is there only a problem with the "flac" OR? - all three 
> files have at least one space in the filename: 

Your mistake seems to be believing that the shell can understand the way 
you're nesting quotes.  It can't.  Each unescaped quote you're using 
simply terminates the quoted string that preceded it.  So your example:

   ssh localhost "find 
/home/phil/music/ambient/RobertGass+OnWingsOfSong/OmNamahaShivaya 
-maxdepth 1 -type f \\( -name "*.mp3" -o -name "*.m4a" -o -name "*.flac" 
\\)"

There are the following quoted strings:

"find /home/phil/music/ambient/RobertGass+OnWingsOfSong/OmNamahaShivaya 
-maxdepth 1 -type f \\( -name "
" -o -name "
" -o -name "
" \\)"

This means two things: First, the wildcards are unquoted when the 
command is run on the remote system.  Second, the wildcards are also 
unquoted on the local system.  So, if there are any mp3, m4a, or flac 
files in the directory where you run that command, or in the default 
login directory on the remote system, the wildcard will be expanded and 
find will only search for files with that specific name.

Instead, use single quotes around the entire command, or escape both the 
quotes and the wildcards.

   ssh localhost "find 
/home/phil/music/ambient/RobertGass+OnWingsOfSong/OmNamahaShivaya 
-maxdepth 1 -type f \\( -name \"\*.mp3\" -o -name \"\*.m4a\" -o -name 
\"\*.flac\" \\)"

   ssh localhost 'find 
/home/phil/music/ambient/RobertGass+OnWingsOfSong/OmNamahaShivaya 
-maxdepth 1 -type f \( -name "*.mp3" -o -name "*.m4a" -o -name "*.flac" \)'



More information about the users mailing list