是否有任何命令可以在传递目录时列出内容,但如果是文件则输出内容?
例如,通常当我浏览目录结构时,我会开始在终端中输入类似的内容
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
手册页。
要使用该功能自动显示目录的目录列表,请执行以下操作:
lesspipe
按照手册页进行设置:eval "$(lesspipe)"
~/.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
添加新选项。