47

I figure there has to be a way of making ls only display non-directories, but the man page doesn't make it obvious

62
ls -p | grep -v /

Using ls -p tells ls to append a slash to entries which are a directory, and using grep -v / tells grep to return only lines not containing a slash.

  • I checked this one because it's my favorite answer (while i did upvote all of them), but now trying to find a way to put it in columns and reverse the order of output... – thinksinbinary Aug 12 '16 at 12:11
  • "You can use 1 switch for single column list" sorry, i did try to figure out what you meant by that, i would appreciate and example/explanation if you would, i only know what a switch is in regards to C programming – thinksinbinary Aug 19 '16 at 0:30
  • @sdkks You don't need the 1 switch when piping the output as it will default to single column in that situation. If that is what you were meaning. – thomasrutter Aug 21 '16 at 23:27
  • @thinksinbinary not sure how to make it multi column but you could search for or ask your own separate question and someone will know. – thomasrutter Aug 21 '16 at 23:28
  • this is not a good solution, it does cut out files containing / in its path: mkdir a;touch a/b; ls a/*| grep -v / – a much better solution for your problem is to use find – rubo77 Apr 10 '20 at 7:45
17

You may try this:

find . -maxdepth 1 -not -type d

And map this to a special alias.

But if you're really keen on using the ls command, here:

ls -p | egrep -v /$

  • find . -maxdepth 1 -not -type d | xargs ls - literally make ls show only the non-directory files. – Wil Nov 3 '20 at 23:55
12

Alternatively:

ls -lAh | grep -v '^d'

This method lists in

  • -l Long list format
  • -A Displays almost all (show hidden files but don't show . and ..)
  • -h Human readable file sizes

while grep

  • -v Don't show matching records
  • Regular expression filter ^d - Those start with letter d (for directory) i.e drwxrwxr-x <some file details> <foldername>

If you don't want to type every time, you may make it into an alias for your bash/shell profile.

2

I saw in your( @thinksinbinary ) comment on the answer by @thomasrutter , that you wanted to be able to print them in reverse order and in columns. You probably have already figured it out or moved on, but here it is:

ls -pr | grep -v / | column
  • -p adds the forward slash ('/') to the directory names
  • -r reverses the order of output
  • -v lets grep do an inverse search to print everything except the directories (everything that doesn't have the '/' that -p put there)
  • "column puts it in columns" - Captain Obvious
  • 1
    i do think it's cool that on the ubuntu forum people still comment on and read your posts after a long time. I've been wanting to get back into linux in order to learn assembly and operating systems since doing so on windows is much more difficult. Thanks! – thinksinbinary Oct 30 '19 at 22:22
1
ls -F | grep -v /

Above command displays files, But it includes symlinks, pipes, etc. If you want to eliminate them too, you can use one of the flags mentioned below.

ls -F appends symbols to filenames. These symbols show useful information about files.

ls -F | grep -Ev '/|@|*|=|>|\|'

Above command displays only files.

1

You might want to use du instead of ls. It will only output files. Then just awk '{print $2}' to output only the file path.

You have to use the -d option with du to limit depth. http://linuxcommand.org/lc3_man_pages/du1.html

  • However, this would show the files even in subdirectories of subdirectories. – Kulfy Oct 31 '20 at 10:18
  • That is true. You can add the -d flag to limit the depth though. I have added an edit to my response to reflect that. – mixcocam Nov 2 '20 at 15:15
  • Yeah. But that would still show directories, for example, Desktop when run from $HOME and won't be an answer to this question since the questioner wants to list files only. – Kulfy Nov 3 '20 at 13:20
0

If you want only files and don't want to perform any operation on them, then run:

ls -lA | grep -v '^d'

Or, if you want to iterate on each file, then for me this works:

ls *.?*
-2

The easy way is the best way. Try with:

ls *.???
  • 2
    A file does not necessarily have an extension with three characters only. Linux even accepts files with no extension at all! – BeastOfCaerbannog Sep 4 '20 at 6:29
  • bzzt. mkdir foo.bar ; touch foo.bar{1,2,3}; touch a b c; ls *.??? shows the contents of the folder foo.bar and none of the local files. – Wil Nov 3 '20 at 23:52

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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