编辑2:对于那些有相同问题的人,请务必阅读已接受答案的评论,因为他们更深入地了解如何正确使用该命令 . 一旦完成后我将发布最终脚本,并自行解释发生了什么 .
我正在尝试编写一个简单的bash函数来清除终端屏幕,然后执行多个 ls
命令以不同的颜色显示当前目录的不同内容类型 .
我已经设法用Python写了一些东西也做了同样的事情,但它有一些很大的缺点(具体来说,文件名中特殊字符的行为在Cygwin上是“iffy”,并且让它适合于它是一种痛苦屏幕) . 我希望它看起来像这样:
*非dotfiles为绿色(出于隐私原因,未在屏幕截图中包含它们) .
我已经设法列出隐藏目录和可见目录,但文件给我带来麻烦 . 使用 ls
来获取我尝试的所有文件的每种方法都使用 -l
参数,或类似 find
或 grep
之类的东西,所有这些都将文件输出到一列(不是我想要的) .
是否可以使用 ls
命令(或其他)仅输出目录的文件或点文件,同时保持 ls
的默认输出格式?
编辑1:这是脚本目前的样子(还不多,但有些人想看到它)
function test() {
clear;
GOLD=229;
RED=203;
BLUE=39;
WHITE=15;
GREEN=121;
# Colored legend.
tput sgr0;
tput setaf bold
# echo's "-n" suppresses the new line at the end.
tput setaf $GOLD;
echo -n "Working Directory ";
tput setaf $RED;
echo -n "Hidden Directories ";
tput setaf $BLUE;
echo -n "Visible Directories ";
tput setaf $WHITE;
echo -n "Hidden Files ";
tput setaf $GREEN;
echo "Visible Files";
pwd;
ls -d .*/; # List hidden directories.
ls -d */; # List visible directories.
# List dotfiles.
# List files.
}
3 回答
仅列出当前目录中的点文件
仅列出其他文件
对于非隐藏文件和目录,请尝试
对于隐藏文件和目录,请使用
使用answer provided by matzeri,我设法得到一个好的开始 . 这个答案仍然被接受,因为它回答了我提出的问题 . 这里's the current version of the script, which I'已经变成了一个易于访问的功能 . 我'm gonna go through it and explain some things that needed to be modified from the answer to give me the result I wanted, but didn' t特别要求 .
首先,我用
stty
包装了整个东西,以阻止用户通过键盘输入搞乱输出 .然后,我创建了布尔值,允许最后的
ls
输出在它们之间以非常小的延迟执行(if [ bool ]
而不是检查列表的状态) .tput
命令简单地使用颜色变量,它允许您更改终端文本的颜色 .Note: 某些颜色值可能已关闭,因为我的Cygwin主题存在问题(目前使用Nord),这些值在我的设置中看起来像他们的名字 . 你的旅费可能会改变 .
To fellow Cygwin users: 我遇到了一些问题,
tput
无法正常工作've worked on an actual Linux machine. If you'遇到问题tput
考虑定义LS_COLORS
(可以格式化为接受RGB值),并将CLICOLOR
变量设置为true,然后导出两者 . 这可以替换tput
命令,尽管您现在可能希望存储两者的初始值,并且必须不断地导出LS_COLORS
变量 .CYG_CWD
和WIN_CWD
是因为Cygwin路径与Windows路径不同,我喜欢两者 .sed
命令将Windows'""替换为"/"以便于复制粘贴 .这就是问题的答案开始的地方 .
DOTDIRS
,DIRS
,DOTFILES
和FILES
变量将获得列表 .ls
命令已经允许我们通过ls -Ad */
和ls -Ad *./
命令过滤以.
开头的目录和目录 .ls
忽略以.
开头的文件,除非指定(像我一样),以/
搜索目录结束,-d
参数使其成为名称目录而不是向我们显示其中的内容 .对于dotfiles和常规文件,
ls
不会't really let us get them, because you can' t指定一个字符,它可以像/
那样为目录定义文件 . 相反,我们可以使用find . -maxdepth -type f
并适当使用-name
或-not -name
参数来过滤我们的文件 . There is an issue, however: 该命令将结果前缀为./
. 所以.bashrc
变成./.bashrc
. 我不希望这样 . 因此输出通过管道传送到sed
命令,该命令将前两个字符替换为空(有效地删除它们) .从这里开始,我们只需确定哪个列表包含元素,设置相应的布尔值以确保最后快速输出
ls
输出,打印图例,同时使用tput
命令更改终端使用的颜色 .最终,调用
ls_list
函数 . 如果给定的布尔值为true,则执行echo "$2" | xargs -d '\n' ls -d
命令 . 从本质上讲,它回显了找到的项目列表,这些项目通过管道输入到xargs -d '\n'
命令中 .xargs
允许我们将传递给它的值作为ls
命令的参数传递 .-d '\n'
参数将分隔符从空格更改为换行符,因为某些名称中可能包含空格 . 什么是ls
,当你给它时文件名,只是用常规ls
输出格式打印它们(这正是我想要的) . 我添加了-d
参数,因此这是名称目录而不是显示其内容,因为我正在为我的所有列表使用该函数 .最后,使用
sgr0
重置tput
,并使用stty
重新启用键盘输入!这是我的
/home
目录的输出 .Final notes:
它感觉比我的Python脚本略慢,但它赢得了't bug-out with special characters in filenames and it will always respect the terminal'的窗口大小,因为这是
ls
的作用 . 我认为"slowness"可能是因为4xargs ls
操作不能同时打印,而python一次打印所有内容 . 我可以忍受它1-2秒vs 0.5-1秒 .