Bash 是否仅以默认的“ls”命令格式显示文件和点文件?

Bash 是否仅以默认的“ls”命令格式显示文件和点文件?,bash,cygwin,ls,Bash,Cygwin,Ls,编辑2:对于有相同问题的人,请务必阅读接受答案上的评论,因为他们更深入地了解如何正确使用该命令。我将发布最后的脚本,一旦它与我自己的解释正在进行 我试图编写一个简单的bash函数,清除终端屏幕,然后执行多个ls命令以不同颜色显示当前目录的不同内容类型 我已经设法用Python写了一些东西,它做了同样的事情,但它有一些很大的缺点,特别是在Cygwin上,文件名中特殊字符的行为是不确定的,要使它正确地适应屏幕是一件痛苦的事情。我希望它看起来像这样: *对于绿色的非点文件,出于隐私原因,未将其包含在屏

编辑2:对于有相同问题的人,请务必阅读接受答案上的评论,因为他们更深入地了解如何正确使用该命令。我将发布最后的脚本,一旦它与我自己的解释正在进行

我试图编写一个简单的bash函数,清除终端屏幕,然后执行多个ls命令以不同颜色显示当前目录的不同内容类型

我已经设法用Python写了一些东西,它做了同样的事情,但它有一些很大的缺点,特别是在Cygwin上,文件名中特殊字符的行为是不确定的,要使它正确地适应屏幕是一件痛苦的事情。我希望它看起来像这样:

*对于绿色的非点文件,出于隐私原因,未将其包含在屏幕截图中

我设法列出了隐藏目录和可见目录,但这些文件给我带来了麻烦。使用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.
}

仅列出当前目录中的点文件

find .  -maxdepth 1 -type f -name ".*" | xargs ls --color=tty
仅列出其他文件

find .  -maxdepth 1 -type f -not -name ".*" | xargs ls --color=tty

对于非隐藏文件和目录,请重试

ls -d *
对于隐藏的文件和目录,请使用

ls -d .*
通过使用,我获得了一个良好的开端。这个答案仍然被接受,因为它回答了我提出的问题。这是脚本的当前版本,我已将其转换为一个易于访问的函数。我将通过它来解释一些需要从答案中修改的东西,以给出我想要的结果,但没有明确要求

c() {
    stty -echo; # Disable keyboard inputs during function.

    local HAS_DOTDIRS=false;
    local HAS_DIRS=false;
    local HAS_DOTFILES=false;
    local HAS_FILES=false;

    local BLUE=39;
    local GOLD=229;
    local GREEN=121;
    local PINK=170;
    local RED=203;
    local WHITE=15;

    local CYG_CWD=$(pwd);
    local WIN_CWD=$(cygpath -w "$(pwd)" | sed 's/\\/\//g');

    local DOTDIRS=$(ls -Ad .*/); # Get directories with '.' prefix.
    local DIRS=$(ls -Ad */); # Get normal directories.
    local DOTFILES=$(find .  -maxdepth 1 -type f -name ".*" | sed 's/^..//');
    local FILES=$(find .  -maxdepth 1 -type f -not -name ".*" | sed 's/^..//');

    clear;
    tput sgr0;
    tput setaf bold;

    local LEGEND="$(tput setaf $GOLD)Cygwin Working Directory ";
    LEGEND+="$(tput setaf $PINK)Windows Working Directory ";

    if ! [ -z "$DOTDIRS" ] ; then
        HAS_DOTDIRS=true
        LEGEND+="$(tput setaf $RED)Hidden Directories ";
    fi

    if ! [ -z "$DIRS" ] ; then
        HAS_DIRS=true
        LEGEND+="$(tput setaf $BLUE)Visible Directories ";
    fi  

    if ! [ -z "$DOTFILES" ] ; then
        HAS_DOTFILES=true
        LEGEND+="$(tput setaf $WHITE)Hidden Files ";
    fi

    if ! [ -z "$FILES" ] ; then
        HAS_FILES=true
        LEGEND+="$(tput setaf $GREEN)Visible Files";
    fi

    echo $LEGEND; 
    echo "";

    echo "$(tput setaf $GOLD)$CYG_CWD";
    echo "$(tput setaf $PINK)$WIN_CWD";

    tput setaf $RED
    ls_list "$HAS_DOTDIRS" "$DOTDIRS"

    tput setaf $BLUE
    ls_list "$HAS_DIRS" "$DIRS"

    tput setaf $WHITE
    ls_list "$HAS_DOTFILES" "$DOTFILES"

    tput setaf $GREEN
    ls_list "$HAS_FILES" "$FILES"

    tput sgr0;

    stty echo; # Enable keyboard inputs after function.
}

ls_list() {
    # $1 - boolean - condition to print
    # $2 - list - names to 'ls'
    if $1 ; then
        echo "$2" | xargs -d '\n' ls -d;
    fi
}
首先,我用stty包装了整个过程,以防止用户将输出与键盘输入弄乱

然后,我创建布尔值,如果[bool]而不是检查列表的状态,则允许在结束时以最小的延迟执行ls输出

颜色变量仅由tput命令使用,该命令允许您更改终端文本的颜色

注意:一些颜色值可能已关闭,这是因为我当前使用的Cygwin主题存在问题,并且这些值看起来像我的设置中的名称。您的里程可能会有所不同

对于Cygwin的其他用户:当tput在实际的Linux机器上工作时,我遇到了一些tput不工作的问题。如果您遇到TPT问题,请考虑定义可以接受RGB值的LSI颜色,并将CICROLROR变量设置为true,然后导出两者。这可以替代tput命令,尽管您现在可能希望存储这两个命令的初始值,并且必须不断导出LS_COLORS变量

CYG_-CWD和WIN_-CWD之所以存在,是因为Cygwin路径与Windows路径不同,我喜欢两者都有。sed命令将Windows“\替换为/以便于复制和粘贴

这就是问题的答案的起点。DOTDIRS、DIRS、DOTFILES和FILES变量将获得列表

ls命令已经允许我们通过ls-Ad*/和ls-Ad*/命令只过滤目录和以..开头的目录。ls忽略以开始的文件,除非像我一样指定,否则以/searches结尾的目录,-d参数将其命名为目录,而不是显示目录中的内容

至于点文件和常规文件,ls实际上不允许我们获取它们,因为您不能像使用/for目录那样指定定义文件的字符。相反,我们可以使用find-maxdepth-type f,并适当使用-name或-not-name参数来过滤文件。但是,存在一个问题:该命令将在结果前面加上前缀。/。所以.bashrc变成了./.bashrc。我不想那样。因此,输出通过管道传输到sed命令,该命令将前两个字符替换为零,从而有效地删除它们

从这里,我们只需确定哪些列表包含元素,设置适当的布尔值以确保在最后快速输出ls,打印图例,同时使用tput命令更改终端使用的颜色

最后,调用ls_list函数。如果给定的布尔值为true,它将执行echo$2 | xargs-d'\n'ls-d命令。本质上,它会回显找到的项列表,该列表通过管道传输到xargs-d'\n'命令中。xargs允许我们通过管道将值作为ls命令的参数传递给它。-d'\n'参数将分隔符从空格更改为换行符,因为某些名称中可能包含空格。当您给它文件名时,ls所做的是si mply使用常规ls输出格式打印它们,这正是我想要的。我添加了-d参数,这就是名称目录,而不是显示它们的内容,因为我对所有列表都使用该函数

最后,使用sgr0重置任何tput,并使用stty重新启用键盘输入

这是my/home目录的输出

最后说明:


它感觉比我的Python脚本稍微慢一点,但它不会在文件名中使用特殊字符,而且它将始终尊重终端的窗口大小,因为ls就是这样做的。我认为速度慢可能是因为4个xargs-ls操作不同时打印,而python操作一次打印所有内容。我可以忍受1-2秒,而不是0.5-1秒。

分享你的狂欢script@kenlukas,完成了,但到目前为止它并没有太多内容。所以,为了确保我正确理解这一点:xargs将给定的参数提供给ls。假设ls只打印文件名,因为find命令返回dotfiles或non-dotfiles的列表。在第二种情况下,all ls是否在自己的格式化输出中打印它们?它还可以在每个结果前面添加一个./,但我可能可以用sed去掉它。您还需要检查列表是否为空,否则ls将只显示所有文件和目录。或者你可以用你喜欢的颜色打印find输出。第二个似乎显示常规目录和非dot文件。知道是什么引起的吗?目录应该显示为find-maxdepth 1-类型d-非-名称。*。从未见过一个文件被报告为directoryMy bad,我没有正确检查空列表。