【问题标题】:Listing directory with hiden files first and grouping directories首先列出包含隐藏文件的目录并分组目录
【发布时间】:2021-06-01 20:49:00
【问题描述】:

我正在尝试编写一个命令/函数来列出显示具有以下规则的文件的任何目录,从顶层到最深层:

  1. 隐藏文件
  2. 目录
  3. 按字母顺序

我想授予的另一个功能是能够将命令/函数用于传递的目录。示例:

目标

基本上我想输入如下内容:

user@machine:cuur-path $ my_listing_magic /some/crazy/directory

得到如下输出:

drwxrwxr-x  6 User Group 4,0K abr  8 12:12  .aaa_dir/
drwxrwxr-x  3 User Group 4,0K abr  8 12:12  .bbb_dir/
drwxrwxr-x  3 User Group 4,0K out 14  2020  .ccc_dir/
-rw-rw-r--  1 User Group 4,1K abr 12 17:44  .a_file
-rw-r--r--  1 User Group   25 dez  4  2017  .b_file
-rw-rw-r--  1 User Group   21 mai 20 15:50  .c_file
drwx------ 44 User Group 4,0K mai 27 16:44  ddd_dir/
drwx------  3 User Group 4,0K abr  5  2018  eee_dir/
drwx------  3 User Group 4,0K abr  5  2018  fff_dir/
-rw-r--r--  1 User Group 4,8K jun  1 18:52  d_file
-rw-r--r--  1 User Group 1,2K jun  1 19:42  e_file
-rw-------  1 User Group 106K jun  1 19:33  f_file

(注意目录... 不存在。)

失败的尝试

只需使用ls 选项

我得到的最接近的是ls -alhvF --group-directories-first。它几乎就在那里,但不遵守所需的顺序并保留...。我可以后验去掉那些,但由于顺序不正确,没有意义。

ls -lv-v 很好,因为它将所有.files/dirs 按字母顺序排序。 ls -l --goups-directories-first 也很酷,符合预期。可惜我不能让它在-v之前“行动”。

分而治之

我想把问题分成两部分:我可以先列出隐藏文件,然后列出未隐藏文件:list_hidden; list_non_hiden。然后为了简单起见,我可以创建一个别名或函数以正确的顺序调用它们。

非隐藏是相当琐碎的!但是仅列出隐藏文件变得有点麻烦。我尝试了ls -ld .!(|.) 之类的东西,但这有使用-d 的缺点——因此它不能用于列出其他目录。至少不是没有文件的完整路径...

谢谢!

【问题讨论】:

  • 简而言之find .... | sort | xargs ls。我不认为你可以让 ls 在目录上添加 / 。你总是可以用 C 语言编写你自己的 ls - 为什么要使用 shell。 any thought please let me know 这不是“任何想法”的论坛——它是编程问题的问答论坛。您正在努力解决什么具体问题?你想问什么问题。请看How to Ask。对于有“想法”的论坛,请查看其他论坛 - quora、reddit 等。
  • @KamilCuk:感谢您提供的途径!对不起,我只是删除了这条线。希望它使“目标”和我尝试的问题更加明显。

标签: bash ls


【解决方案1】:

ls 实用程序不支持您想要的。所以自己实现吧。列出文件,然后对它们进行排序,然后自己 ls 它们。使用零终止流和 GNU coreutils 和 findutils 的脚本可能如下所示:

{
     printf "%s\0" . ..;
     cmd=(
        find "${1:-.}" -mindepth 1 -maxdepth 1 '('
            -name '.*' '('
               -type d -printf "1 %p\0"
            ')' -o 
                -printf "2 %p\0"
        ')' -o '('
             '!' -name '.*' '('
                 -type d -printf "3 %p\0"
            ')' -o
                 -printf "4 %p\0" 
        ')'
     )
     "${cmd[@]}" |
     sort -z |
     cut -z -d' ' -f2-;
} | xargs -0 ls -ald

你可以用你自己的行为来修补一些开源的ls 实用程序——这很好,我赞成在 GNU coreutils ls 中实现它作为另一个选项,比如 --sort-hidden-directories-首先将它们排序在隐藏文件的前面。

您也可以在 C 中编写自己的 ls 实用程序(或者您可以在 shell 中重新实现 ls,但我怀疑这会比只用 C 编写更难)。


因为我很早就喜欢这个想法并希望将隐藏文件排在其他任何位置之前,所以我使用上述方法创建了this l utility

【讨论】:

    猜你喜欢
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 2016-02-11
    • 2021-06-07
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多