如果是目录,则命令列出内容;如果是文件,则输出内容?

如果是目录,则命令列出内容;如果是文件,则输出内容?

是否有任何命令可以在传递目录时列出内容,但如果是文件则输出内容?

例如,通常当我浏览目录结构时,我会开始在终端中输入类似的内容

ll /etc/path/  # I see a file in tab-completion that interests me, called myfile.txt
ll /etc/path/myfile.txt  # I do the auto-completion to get it into the command line
less /etc/path/myfile.txt  # Now I have to go back and change 'll' to 'less'

或者,如果我正在寻找文件,我会从

less /etc/path  # I see in tab-completion several files that might interest me, so I need to know more
ll /etc/path  # See more info about file sizes, etc, so I can choose the file I want. Have to change 'less' to 'll'
less /etc/path/myfile.txt  # Now that I know which file I want, I have to go back and change 'll' to 'less'

这是我每天要做几十次的事情,并开始减慢我的速度。是否有一个命令或脚本可以满足您最可能的情况?例如

some-program /etc/path/to/file/or/directory

如果目标是文本文件或文本文件的符号链接,则将执行“less /etc/path/to/.....”。但如果是其他东西,例如目录、二进制文件、块设备,它将执行“ll /etc/path/to/......”

当然,如果它做了你不想要的事情,比如文件符号链接上的“less”,但你想用“ll”查看符号链接本身,那么你只需手动运行“ll”。

存在这样的东西吗(我敢打赌它就在那里,这似乎是一个常见的任务)?或者我只是以一种低效的方式使用 Linux 命令行,并且有更好的方法来浏览它......你是怎么做的?或者我真的是唯一一个一直在命令行中来回切换“less”和“ll”然后再切换回来的人?

some-program() {
  if [[ $# > 1 ]]; then
    echo "Only one argument supported at this time"
  exit 1
  fi
  if [[ $# == 0 ]]; then
    ELEMENT="."
  else
    ELEMENT="$1"
  fi
  if [[ -d $ELEMENT ]]; then
    ls --color=auto -alF "$ELEMENT"
  else
    less "$ELEMENT"
  fi
}

答案1

less有一个非常简洁的内置功能,可以让你做这样的事情。请参阅lesspipe手册页。

要使用该功能自动显示目录的目录列表,请执行以下操作:

  1. lesspipe按照手册页进行设置:eval "$(lesspipe)"

  2. ~/.lessfilter使用以下内容创建并使其可执行:

    #!/bin/sh
    if [ -d "$1" ]; then
        ls -alF "$1"
    else
        # We don't handle this format.
        exit 1
    fi
    exit 0
    

这将设置一个运行的过滤器脚本来lesspipe处理文件类型。它会检查您要查看的内容是否是目录,如果是,ls则运行。

您最初的要求包括颜色。不幸的是,这有点困难,因为less默认情况下不显示颜色,并且过滤器脚本的输出仍然通过管道传输less。您需要使用-R默认选项(如果您查看过二进制文件,这可能不是一个好主意)来执行此操作。我认为没有办法让 lessfilter 脚本告诉less添加新选项。

相关内容