This is the default behaviour of ls

ls /net/nas/data/languages/pypm/sites/rex/free/2.6/*/pool/v/vi/virtual*1.4.4*pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/linux-x86/pool/v/vi/virtualenv-1.4.4_linux-x86_2.6_1.pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/linux-x86_64/pool/v/vi/virtualenv-1.4.4_linux-x86_64_2.6_1.pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/macosx/pool/v/vi/virtualenv-1.4.4_macosx_2.6_1.pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/win32-x86/pool/v/vi/virtualenv-1.4.4_win32-x86_2.6_1.pypm

How do I make ls print only the basename? Like:

ls $OPTIONS /net/nas/data/languages/pypm/sites/rex/free/2.6/*/pool/v/vi/virtual*1.4.4*pypm
virtualenv-1.4.4_linux-x86_2.6_1.pypm
virtualenv-1.4.4_linux-x86_64_2.6_1.pypm
virtualenv-1.4.4_macosx_2.6_1.pypm
virtualenv-1.4.4_win32-x86_2.6_1.pypm

Note: I prefer shell globbing over using find as /net/nas/data/languages/pypm/sites/rex/free contains huge number of files and directories.

link|improve this question

59% accept rate
you prefer shell globbing OVER using find when the directory contains lots of files? typo?? – akira Aug 10 '10 at 15:24
I'm guessing that the OP doesn't want a listing of subdirectories, and is unaware of the option of passing -maxdepth 1 to find. – intuited Aug 10 '10 at 16:12
feedback

6 Answers

up vote 5 down vote accepted

While xargs -0 is intended to be used for input delimited by \0 (like find -print0), ls has no such option to delimit its output in this way.

However,

ls -1 /path/glob | tr '\n' '\0' | xargs -0 -n 1 basename

would do the trick to convert newlines to nulls along the way. This then allows xargs to work with names that have spaces.

EDIT: added -n 1 to xargs

link|improve this answer
This does not work for me: basename: extra operand \033[0m/net/nas/data/languages/pypm/sites/rex/free/2.6/macosx/pool/v/vi/virtual‌​env-1.4.4_macosx_2.6_1.pypm\033[0m'` – Sridhar Ratnakumar Jan 20 '10 at 0:07
@Sridhar: you might need the -n 1 you suggested elsewhere as an option to xargs ? (answer edited) – Steve Folly Jan 20 '10 at 0:35
Although I personally prefer my own answer (as I almost never have to deal with spaces in filenames), I will mark this as the answer for it handles spaces as well. – Sridhar Ratnakumar Jan 20 '10 at 7:36
If the mac version of xargs supports the -d (delimiter) option, you can do ls ... | xargs -d '\n' -n 1 basename. – intuited Aug 10 '10 at 16:14
feedback

ls [optional path]| xargs -0 basename

link|improve this answer
1  
-1: ls can't delimit names by \0 which is what xargs -0 is looking for. – Steve Folly Jan 19 '10 at 20:49
feedback

Found the answer myself .. which is to use the basename command.

ls /net/nas/data/languages/pypm/sites/rex/free/2.6/*/pool/v/vi/virtual*1.4.4*pypm | xargs -n 1 basename
virtualenv-1.4.4_linux-x86_2.6_1.pypm
virtualenv-1.4.4_linux-x86_64_2.6_1.pypm
virtualenv-1.4.4_macosx_2.6_1.pypm
virtualenv-1.4.4_win32-x86_2.6_1.pypm
link|improve this answer
1  
I would also add a -1 (dash one) to the LS command to ensure that you only get one per line – Roy Rico Jan 19 '10 at 20:00
1  
This wont work if there are spaces in the filenames (see my answer). – Steve Folly Jan 19 '10 at 20:49
feedback
ls -1 <path> | sed 's#.*/##'
link|improve this answer
feedback

You said you prefer globbing over find, but did you know that the two are not mutually exclusive? Globbing happens on any command you run, not just ls. For example:

$ export BASE=/net/nas/data/languages/pypm/sites/rex/free/2.6

$ echo $BASE/*/pool/v/vi/virtual*1.4.4*pypm | xargs basename
$ ls $BASE/*/pool/v/vi/virtual*1.4.4*pypm | xargs basename
$ find $BASE/*/pool/v/vi/virtual*1.4.4*pypm -print0 | xargs -0 basename

Notice that the find example can make use of -print0 which handy if your paths contain whitespace (the tr-based solutions mentioned elsewhere work great on normal spaces, but not on files containing actual newlines).

Lastly, if you have access to GNU find, you can also use -printf which avoids the basename call altogether:

$ find $BASE/*/pool/v/vi/virtual*1.4.4*pypm -printf '%f\n'
link|improve this answer
Unfortunately, -printf option is not available in MacOSX version of find. – Sridhar Ratnakumar Jan 20 '10 at 3:02
Good call; apologies for the oversight. I've updated the answer. – Ryan Bright Jan 21 '10 at 23:37
feedback

ls -1 /path/glob | awk -F'/' '{print $NF}'

link|improve this answer
feedback

Your Answer

 
or
required, but never shown

Not the answer you're looking for? Browse other questions tagged or ask your own question.