有没有办法让 ls 仅显示某些目录的隐藏文件?

有没有办法让 ls 仅显示某些目录的隐藏文件?

我有一个目录,无论选择什么用户或选项,我都希望它始终显示隐藏文件。

我知道该-a选项会显示隐藏文件。我只是想自动做出使用该选项的决定。

假设我在 /home/user 中,我不关心看到隐藏文件,但如果我在 /filestopprocess 中,我想查看隐藏文件。

这种类型的功能存在吗?

答案1

我能想到的最简单的方法是创建一个映射到函数的 shell 别名。假设我们正在使用 bash 并将以下别名添加到您的.bashrc

alias ls=ls_mod

现在,添加ls_mod以下函数:

ls_mod () {
    DIRS_TO_SHOW_HIDDEN=(dir1 dir2 dir3)
    for DIR in "$@"; do
        for CHECK in "${DIRS_TO_SHOW_HIDDEN[@]}"; do
            if [ "$(realpath "$DIR")" == "$CHECK" ]; then
                ls -a "$DIR"
            else
                ls "$DIR"
            fi
        done
    done
}

我还没有测试过这个,所以我怀疑它是否完美,但至少它给了你这个想法。您可能需要努力将额外的参数传递给ls.

答案2

为了充实我对 John Moon 答案的评论,这里有一个函数,如果路径与某个列表匹配,它会包装ls并添加一个标志:-a

function ls() {
  # if no arguments are provided, the current directory is assumed
  [ "$#" -eq 0 ] && set .
  case "$(realpath "$1")" in
        (/path/to/jason/filestoprocess*|\
         /path/to/jason/otherfilestoprocess*)
                set -- -a "$1" ;;
  esac
  command ls "$@"
}

该函数的第一部分检查是否ls正在完成裸露操作;在本例中,我们将.(当前目录)设置为参数#1;否则,我们假设(给定的)第一个参数是列表的路径。

如果设置或给定的路径与列出的模式匹配(此处为 ...filestoprocess 或 ...otherfilestoprocess ),则我们set再次使用将标志添加-a到参数中。最后,我们使用我们安排的参数来command调用实际的命令。ls谢谢穆鲁指出set简化!

要添加更多路径,只需继续模式,用管道(|)字符分隔它们即可。我使用反斜杠转义字符将两个现有模式分成单独的行,\以使它们更易于阅读。

如果您已经ls为某些内容添加了别名,则该别名将优先,并且需要将其删除才能使该函数正常工作(否则,别名添加的任何标志都将传递给该函数并最终出现在 中$1)。如果您希望ls默认使用某些标志,只需将它们添加到两个相应的command ls调用中即可。

相关内容