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>