Free tech support / small logo


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.









Subscribe!
Never miss another Q&A article! Click to subscribe: Add to Google Reader Add to My Yahoo! Subscribe in NewsGator RDF XML
Comments

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

Posted by: Jadu at February 26, 2007 10:15 PM

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

Posted by: leila at November 7, 2008 6:15 AM

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.

Posted by: Janeesh at June 9, 2010 10:45 PM

I have something to say, now that you mention it, but ...
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 for all your efforts on this Web site by buying you a cup of coffee!

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











Remember personal info?


Please note that I will never send you any unsolicited email. Ever.

While I'm at it, 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.









Recent Entries


Search
I Need Help!
Need Help? Ask Dave Taylor!


© 2002 - 2012 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.

[whiteboard marker tray]
"Ask Dave Taylor®" is a registered trademark of Intuitive Systems, LLC.