5

Okay guys, this is an experimental question warning!

I often confuse cat and ls when quickly working on the console. Not because I forget their meanings, no. Just because I type without deeply thinking about the command - it just comes automatically. I am sure everyone knows what I am trying to explain: you don't have to think what to type if your task is to list, say, a text file - or a directory.

Now, why two different commands? Things would be more fluently if there was a command that lists a directory if the target is a directory and that lists the content of a file if the target is a file.

Does such a command exist?

I know there are editors (e. g. vim) with the ability to list a directory. But this is not what I want, as I want to stay on the console. Second, after opening a file through the vim directory listing there is no way back - at least none that I know.

If there is no out-of-the-box solution I will try to make a small bash script (wrapper) to cat and ls. But this is not preferred, because when working with many different systems it has to be placed on each of them...

2
  • Emacs is having a mode for shell and for directory browsing ... (SCNR)
    – frlan
    Apr 16, 2014 at 18:41
  • Did you read my paragraph about the vim directory browsing mode? If yes, is emacs different/better here? In the end I don't want to leave the console into an application for actions beyond the cat/ls scope.
    – Nicolas
    Apr 16, 2014 at 20:47

2 Answers 2

8

Simply put this function is your .bashrc:

catls()
{
  [[ -f "$1" ]] && cat "$1" || ls "$1";
}

It will cat regular files but call ls for directories

7
  • 1
    if this is for bash, then use [[ ... ]] instead of test <TEST> or [ ... ]. [ ... ] and test <TEST> are deprecated syntax and should only be used when [[ ... ]] is not available. Apr 16, 2014 at 21:36
  • @AlexejMagura, thanks for the deprecation notice, I've updated my answer Apr 16, 2014 at 21:39
  • 1
    Also note, that if $1 is a file or path containing a space: this function will break because $1 is not double quoted. Apr 16, 2014 at 21:41
  • @AlexejMagura: Good point Apr 16, 2014 at 21:42
  • 1
    On a side note, $1 won't break on expansion if unquoted inside [[]], [[]] is smarter than []
    – kos
    Sep 14, 2015 at 20:44
1

Hate to necrobump and unable to just comment; but fix for when nothing is passed.

catls() { [[ -f "$1" ]] && cat "$1" || ls "${1:-.}"; }
0

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .