Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

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.

share|improve this question
    
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

8 Answers 8

up vote 10 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

share|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

I use this:

ls | tr '\n' '\n'

It gives a list like:

file1.mp3
file2.mp3
file3.mp3
...
share|improve this answer
3  
This is essentially the same as ls -1 (and coloring disabled), as ls implies those when not writing to a terminal. It looks like you're missing the point a bit, as the issue is stripping the dir name swhen specifying ls path arguments using wild cards. Try ls -d "$PWD/"* | tr '\n' '\n' to see what the actual issue is. –  Daniel Beck Oct 8 '12 at 19:45

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
share|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
ls -1 <path> | sed 's#.*/##'
share|improve this answer
    
AH! Finally something that works with multiple arguments! –  Aurélien Ooms Sep 16 at 9:27

ls [optional path]| xargs -0 basename

share|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

awk solution:

ls -1 /path/glob | awk -F'/' '{print $NF}'
share|improve this answer

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'
share|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

go to the directory where you have all you files and type.

find *.pypm
share|improve this answer
1  
OP explicitly declared that he doesn't want to use find. –  gronostaj Aug 14 at 18:07
1  
Also, this doesn't even do what the OP needs. (Note: You should use find . -name '*pypm' if at all… just putting the glob next to find achieves nothing – then you could just write ls *.pypm.) –  slhck Aug 14 at 18:31

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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