Industry guru Dave Taylor offers tech support on technical and business topics, including iPhone, iPod, Microsoft Windows, Sony PSP, cellphones, online advertising, CSS, Web design, business, Unix, Linux, SEO, Mac OS X, and shell script programming.     


Extracting Directory Names within a Shell Script

A reader writes:
First, thanks for writing Wicked Cool Shell Scripts. I've found them quite useful and I've learned many things from those scripts. I just have a question and I was wondering if you could point me in the right direction.

I'm trying to write a shell script that will pull the top-level directories out of a list of file paths, example:

list of files:
/usr/local/test
/usr/bin/test
/opt/Tivoli/dat
/opt/lib/test
/tmp/files/test
/tmp/local/test

Output after script:
/usr
/opt
/tmp


Dave's Answer:
Initially I thought that this would be a perfect job for dirname, the partner to the better known basename utility. It's not, though, because basename /usr/lib/test is "/usr/lib", not just "/usr". So instead, I'd use cut, a utility I write about in the book too. The cut utility lets you specify the delimiter for field separation and also lets you specify what field you're interested in, so here's what happens when we put all of that together:
$ echo /usr/lib/test | cut -d/ -f2
usr
You can drop that into a pipeline and if we assume that your list of files is itself in a file called "filelist", you're halfway there with this one line:
cut -d/ -f2 filelist
If you want to prepend the slash, you can do that with sed, but let's tackle the "unique" part first with uniq. Since that particular utliity only works if the input is sorted, here's the pipe I have:
cut -d/ -f2 filelist | sort | uniq | sed 's/^/\//'
That'll do everything you want and it's short enough to be an alias!

Hope that helps and good luck with your script writing efforts.


Related Shell Script Programming articles:
✔   Secretly capture screenshots on my Mac?
When I used to work on a Linux system, there was a utility we had that would let me take screen captures every...
✔   Parsing "id" strings in a Shell Script?
Hello Dave. I need a Bash shell script that creates a directories with the group names automatically when user logs in to the...
✔   Copy and Paste from the Mac OS X Command Line?
I am constantly running commands in Terminal.app on my MacBook and then copying and pasting the results into email messages or documents. Yes,...
✔   Script to test line lengths for Twitter compatibility?
I've been tasked with writing a series of tweets for a Black Friday marketing campaign and am finding it a bit tricky because...
✔   Shell script to convert lowercase to title case?
As part of a project I'm working on, I find myself deep in a Linux shell script, needing to have a subroutine that...

Let's stay in touch!
Sign up for my weekly AskDaveTaylor Newsletter and you'll receive even more tech and gadget help right to your inbox, along with exclusive news and industry updates. It's good stuff. I promise!
    Enter your name: and your email addr:  









Reader Comments To Date: 3

Jadu said, on February 26, 2007 10:15 PM:

Good question, I tried this way:

[jsaikia@zorro trap]$ cat dir.names
/usr/local/test
/usr/bin/test
/opt/Tivoli/dat
/opt/lib/test
/tmp/files/test
/tmp/local/test

[jsaikia@zorro trap]$ cat dir.names | awk -F "/" '{print "/"$2}' | sort | uniq
/opt
/tmp
/usr

leila said, on November 7, 2008 6:15 AM:

Hi, I have problem with some shell programing ,would you please help me?
1) I am trying to write a shell script in ksh to do like dir and shows directories
2)Is it possible to write a shell script in ksh with FOR to loop infinitely?
3)I want to write a shell script in ksh to mark every line(menu)that cursor is and show submenu.

thanks alot for your kindly attention

Janeesh said, on June 9, 2010 10:45 PM:

Extracting Directory Names within a Shell Script can be done using the following command

[janeesh@jansworld.in usr]# find /usr -type d -maxdepth 1
/usr
/usr/local
/usr/bin
/usr/share
/usr/games
/usr/ofed
/usr/lib
/usr/include
/usr/libexec
/usr/man
/usr/etc
/usr/kerberos
/usr/X11R6
/usr/src
/usr/sbin

This will list all the directories in /usr folder.

Starbucks coffee cup I do have a lot to say, and questions of my own for that matter, but first I'd like to say thank you, Dave, for all your helpful information by buying you a cup of coffee!

I do have a comment, now that you mention it!











I will never send you any unsolicited email. Ever.






Check This Out Too...

 
Look for Answers
Need Help? Ask Dave Taylor!


Follow Me on Pinterest

Find Me on Google+
ADT on G+
© 2002 - 2013 by Dave Taylor. All Rights Reserved.

Note: This web site is for the purpose of disseminating information for educational purposes, free of charge, for the benefit of all visitors. We take great care to provide quality information. However, we do not guarantee, and accept no legal liability whatsoever arising from or connected to, the accuracy, reliability, currency or completeness of any material contained on this web site or on any linked site. Further, please note that by submitting a question or comment you're agreeing to my terms of service, which are: you relinquish any subsequent rights of ownership to your material by submitting it on this site. My lawyer says "Thanks".
"Ask Dave Taylor®" is a registered trademark of Intuitive Systems, LLC.