Dealing with Spaces in Filenames

Just grabbed a copy of the magazine from the bookstore but it was still the February edition. I am responding to callout at the end of the "Working the Shell" article on "Dealing with Spaces in Filenames" by Dave Taylor. This is my first time on the forum and I couldn't find an existing thread on this so I'm starting this one. Sorry if this is the wrong place to do this.

I'm a little unclear about some things Dave says on IFS. At one point, he quotes the Bash man page's IFS entry under the Shell Variables heading and then goes on to say that this doesn't really solve our filename problem. Later in the article he includes IFS in his possible solution paths. I'm not really sure if this is contradictory here or if I'm missing something.

As it happens, I do actually use IFS for exactly this purpose. The Bash man page is in dire need of an update. This is unfortunate because IFS is used in other areas of the Bash shell. This entry in the man page should reflect that broader scope. Actually, if you search the man page for IFS, you'll see many hits, notably under the Expansion > Word Splitting heading.

Here is how I use IFS for this purpose:

#!/bin/sh

FILENAMES=$(ls)

OIFS="$IFS"
IFS=$'\n'
for x in $FILENAMES
do
 echo "$x"
done
IFS="$OIFS"

By setting IFS in this way, we are removing the space and tab portions of its definition. Now we are getting exactly what we want which is separation, or word splitting, on newline characters only.

It's important to note that a lot of people believe 'unset IFS' will revert revert IFS back to the default value. This is actually not true. This will really just set IFS to null. According to the man page, (which is accurate this time) when IFS is set to null and is used by a builtin it is assumed to be a space. This is in contrast to the default value of "\s\t\n". By creating and setting OIFS to equal IFS (the double quotes here are required to make this work correctly!) we can restore it to the original value later.

Is this what Dave was looking for?

P.S. The example script above will also handle the quoted filenames from the article.

This is fantastic! I love the

melanie14's picture

This is fantastic! I love the idea! I can't wait to see if these things will work. Thanks!

Webcast
How to Build an Optimal Hadoop Cluster to Store and Maintain Unlimited Amounts of Data Using Microservers

Realizing the promise of Apache® Hadoop® requires the effective deployment of compute, memory, storage and networking to achieve optimal results. With its flexibility and multitude of options, it is easy to over or under provision the server infrastructure, resulting in poor performance and high TCO. Join us for an in depth, technical discussion with industry experts from leading Hadoop and server companies who will provide insights into the key considerations for designing and deploying an optimal Hadoop cluster.

Learn More

Sponsored by AMD

White Paper
Red Hat White Paper: Using an Open Source Framework to Catch the Bad Guy

Built-in forensics, incident response, and security with Red Hat Enterprise Linux 6

Every security policy provides guidance and requirements for ensuring adequate protection of information and data, as well as high-level technical and administrative security requirements for a system in a given environment. Traditionally, providing security for a system focuses on the confidentiality of the information on it. However, protecting the data integrity and system and data availability is just as important. For example, when processing United States intelligence information, there are three attributes that require protection: confidentiality, integrity, and availability.

Learn more about catching the bad guy in this free white paper.

Learn More

Sponsored by DLT Solutions