Celeb Glow
general | March 30, 2026

How can I make ls only display files?

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

3

8 Answers

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.

11

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 /$

1

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.

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

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 *.?*
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.

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.

3

What if you only want folders, only files or both?

What if you want hidden files or hidden folders or not?

showVisibleFilesOnly() { ls -p | grep -v /
}
showVisibleFoldersOnly() { ls -p | grep / | grep "^."
}
showOnlyFilesIncludingHidden() { ls -Ap | grep -v / | grep "^."
}
showOnlyFoldersIncludingHidden() { ls -Ap | grep / | grep "^."
}
showHiddenFoldersOnly() { ls -Ap | grep / | grep "^\." | grep "\."
}
showHiddenFilesOnly() { ls -Ap | grep -v / | grep "^\." | grep "\."
}
showAllFilesAndFoldersIncludingHidden() { ls -Ap
}
showHiddenFilesAndFoldersOnly() { ls -Ap | grep "^\."
}
1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

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