Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 17 Aug 2010 08:35:25 -0700
From:      Drew Tomlinson <drew@mykitchentable.net>
To:        FreeBSD Questions <freebsd-questions@freebsd.org>
Subject:   Re: Bash Script Help - File Names With Spaces
Message-ID:  <4C6AAC3D.30400@mykitchentable.net>
In-Reply-To: <20100817152217.GF3974@libertas.local.camdensoftware.com>
References:  <4C6AA0FD.8000100@mykitchentable.net> <20100817152217.GF3974@libertas.local.camdensoftware.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On 8/17/2010 8:22 AM, Chip Camden wrote:
> Quoth Drew Tomlinson on Tuesday, 17 August 2010:
>    
>> I have a collection of yearly top 100 Billboard mp3s in this format (all
>> one line - sorry if it wraps):
>>
>> /archive/Multimedia/Audio/Music/Billboard Top USA Singles/1980-028 Kenny
>> Loggins - This Is It.mp3
>>
>> I want to create symbolic links to the top 30 in 1966-1969 in another
>> directory for easy migration to a flash card. Thus I invoked 'find' to
>> get a list (again, all one line):
>>
>> find -E "/archive/Multimedia/Audio/Music/Billboard Top USA Singles"
>> -regex '.*19[6-9][0-9]-0[0-2][0-9].*'
>>
>> (OK, I know this will only return the top 29)
>>
>> 'find' returns the complete filename as above:
>>
>> /archive/Multimedia/Audio/Music/Billboard Top USA Singles/1980-028 Kenny
>> Loggins - This Is It.mp3
>>
>> Then I attempt to use 'basename' to extract the file name to a variable
>> which I can later pass to 'ln'.  This seems to work:
>>
>> basename "/archive/Multimedia/Audio/Music/Billboard Top USA
>> Singles/1980-028 Kenny Loggins - This Is It.mp3"
>>
>> returns (all one line):
>>
>> 1980-028 Kenny Loggins - This Is It.mp3
>>
>> which is what I would expect.  However using it with 'find' give me this
>> type of unexpected result:
>>
>> for i in `find -E "/archive/Multimedia/Audio/Music/Billboard Top USA
>> Singles" -regex '.*19[6-9][0-9]-0[1-2][0-9].*'`; do basename "${i}";done
>>
>> 1980-028
>> Kenny
>> Loggins
>> -
>> This
>> Is
>> It.mp3
>>
>> Why is this different? And more importantly, how can I capture the file
>> name to $i?
>>      
> Try:
>
> find -E ... | while read i; do; basename $i; done
>
> When using back-ticks, all the output gets appended together,
> space-separated.  Then 'for' can't tell the difference between a space in
> a filename and a delimiter.  Using 'read' instead preserves line
> boundaries.

Thanks for your reply.  I like this better than manipulating $IFS 
because then I don't have to set it back.

Cheers,

Drew

-- 
Like card tricks?

Visit The Alchemist's Warehouse to
learn card magic secrets for free!

http://alchemistswarehouse.com




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4C6AAC3D.30400>