首页 文章

仅显示默认“ls”命令格式的文件和Dotfiles?

提问于
浏览
0

编辑2:对于那些有相同问题的人,请务必阅读已接受答案的评论,因为他们更深入地了解如何正确使用该命令 . 一旦完成后我将发布最终脚本,并自行解释发生了什么 .

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

我已经设法用Python写了一些东西也做了同样的事情,但它有一些很大的缺点(具体来说,文件名中特殊字符的行为在Cygwin上是“iffy”,并且让它适合于它是一种痛苦屏幕) . 我希望它看起来像这样:

Python Example

*非dotfiles为绿色(出于隐私原因,未在屏幕截图中包含它们) .

我已经设法列出隐藏目录和可见目录,但文件给我带来麻烦 . 使用 ls 来获取我尝试的所有文件的每种方法都使用 -l 参数,或类似 findgrep 之类的东西,所有这些都将文件输出到一列(不是我想要的) .

是否可以使用 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 回答

  • 0

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

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

    仅列出其他文件

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

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

    ls -d *
    

    对于隐藏文件和目录,请使用

    ls -d .*
    
  • 0

    使用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特别要求 .

    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 包装了整个东西,以阻止用户通过键盘输入搞乱输出 .

    然后,我创建了布尔值,允许最后的 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_CWDWIN_CWD 是因为Cygwin路径与Windows路径不同,我喜欢两者 . sed 命令将Windows'""替换为"/"以便于复制粘贴 .

    这就是问题的答案开始的地方 . DOTDIRSDIRSDOTFILESFILES 变量将获得列表 .

    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 目录的输出 .

    enter image description here

    Final notes:

    它感觉比我的Python脚本略慢,但它赢得了't bug-out with special characters in filenames and it will always respect the terminal'的窗口大小,因为这是 ls 的作用 . 我认为"slowness"可能是因为4 xargs ls 操作不能同时打印,而python一次打印所有内容 . 我可以忍受它1-2秒vs 0.5-1秒 .

相关问题