在 Linux 中隐藏文件而不使用点

在 Linux 中隐藏文件而不使用点

我希望在 Linux 中隐藏文件而不使用点,因为在 Windows 中这是可能的。

有没有办法做到这一点?

答案1

在目录中创建一个文件.hidden,其中包含要隐藏的文件的名称(每行一个名称)。

然后将以下内容添加到您的~/.bashrc

ls () {
  if [ -f .hidden ]; then
    declare GLOBIGNORE="$GLOBIGNORE:.*:$(tr '\n' ':' < .hidden)"
    ls "$@"
  fi
}

现在您的ls命令没有列出这些文件。

我使用这种技术来隐藏我的__pycache____init__.py文件。


编辑:按照其他评论这也会将它们隐藏在至少一个(Nautilus)中,但也可能隐藏在几个 GUI 文件浏览器中。

答案2

你不能。文件系统处理隐藏设置的方式存在根本区别。在 Windows 中,文件系统在元数据中存储文件的几个属性,包括属性“隐藏”和“系统”(两者都是隐藏文件)。在常见的 *nix 文件系统中,不存储此类属性。相反,必须将信息放在其他地方,例如文件名中。因此,惯例是大多数工具默认不会显示以 . 开头的文件(取决于您的系统,可能还有其他一些文件,如 _)。

这纯粹是为了方便,文件名以 . 开头绝对没有任何意义,只是“用户可能不想一直看到这个”。为了确保您知道,运行 egls -a将显示所有文件。

如果您不想让文件在 Linux 中弄乱您的列表,您应该将其重命名为以点开头(额外好处:如果我们谈论的是便携式设备,这也适用于 OS X)。如果您不希望用户能够找到文件,那么您做错了 - 这就是权限的用途。

Unix 权限与目录有关,这常常使人感到困惑,也许更好地理解它会对你有所帮助。对于目录,“读取”和“执行”权限(rx)的含义与文件不同。对于目录,执行x权限决定您是否可以访问目录中的 inode。读取r权限决定您是否可以访问目录的列表。从功能上讲,x允许用户在目录中执行操作,而权限则r允许用户查看目录中的内容。它们是不同的,并且差异可能令人困惑。让我们看一个例子:


jeanluc@login64: ~ $ mkdir example
jeanluc@login64: ~ $ echo "you can read it" > example/file
jeanluc@login64: ~ $ ls example/
file
jeanluc@login64: ~ $ cat example/file
you can read it

jeanluc@login64: ~ $ chmod -x example/
jeanluc@login64: ~ $ ls example/
ls: cannot access example/file: Permission denied
file
jeanluc@login64: ~ $ cat example/file
cat: example/file: Permission denied
jeanluc@login64: ~ $ cd example/
-bash: cd: example/: Permission denied

jeanluc@login64: ~ $ chmod +x example/
jeanluc@login64: ~ $ chmod -r example/
jeanluc@login64: ~ $ ls example/
ls: cannot open directory example/: Permission denied
jeanluc@login64: ~ $ cat example/file
you can read it
jeanluc@login64: ~ $ cd example/
jeanluc@login64: ~/example $ ls
ls: cannot open directory .: Permission denied
jeanluc@login64: ~/example $ cd ..

因此,请注意,如果没有执行,我仍然可以列出文件(尽管 ls 显示错误,因为它无法获取文件属性),但我无法更改目录或读取其中的文件。如果没有读取,我无法列出文件,但我仍然可以更改目录,如果我知道文件的名称,我仍然可以访问它。

但请注意,删除读取权限只能通过隐蔽性来提供安全性。如果用户猜出文件名,他们将能够读取其内容。

这可能与您的问题实际上并不相关,我只是想确保您了解目录权限。

答案3

实际上,您可以在 Linux 中隐藏文件,而无需添加点。这实际上会将它们隐藏在 Nautilus 中;ls命令行仍会列出文件。

  1. .hidden创建一个以您想要隐藏文件的文件夹命名的文本文件。
  2. 将要隐藏的文件或文件夹的名称(每行一个)添加到文件中。
  3. 刷新您的文件浏览器。

答案4

如果您有一些编程技能,并且您所需要的只是隐藏文件名以方便用户,以免混淆视觉空间,那么您可以破解它!

我将仅考虑命令行工具,因为它们非常统一并且是我经常使用的唯一工具。

存储这些信息的方法有很多种:

  1. 您可以在选定文件中存储“隐藏”扩展属性。请参阅man attr

      attr -s hidden -V true your_file
    
  2. 或者如上所述,您可以将文件名列表存储在.hidden文件中

重要的:这将不起作用,您必须实现逻辑,干净的系统只会忽略.hidden文件和hidden扩展属性!

此外,还有多种可能的实现:

  1. 如果你只有几个文件,请在.bashrc文件中写入

    alias ls='ls -I filename_1 -I filename_2'
    

    man ls了解更多信息。

  2. 编写一个function ls这样的程序,它处理识别隐藏文件和汇编所有条目列表背后的所有逻辑-I,然后 /bin/ls使用适当的忽略标志执行。这是一项非常费力的任务,因为您必须ls正确处理所有参数。

  3. 获取 coreutils 的源代码

    git clone git://git.sv.gnu.org/coreutils
    

    或者

    git clone git://git.suckless.org/sbase
    

    按照您需要的方式对隐藏文件进行修补。并将其放在您的PATH

    我使用 suckless 源在不到 5 分钟的时间内就破解了它,差异如下:

     diff --git a/ls.c b/ls.c
     index cdfce4d..8197409 100644
     --- a/ls.c
     +++ b/ls.c
     @@ -214,6 +214,17 @@ lsdir(const char *path)
             first = 0;
             while ((d = readdir(dp))) {
     +///////////////////////////////////////////////
     +// Dirty hack to implement hidden files
     +// FIXME: Make proper(!) subroutine
     +               char attr_command[1024] = "attr -Lqg hidden "; // Oh, dear. That's bad
     +               int attr_code;
     +               strcat(attr_command, d->d_name);
     +               strcat(attr_command, " >/dev/null 2>&1");
     +               attr_code = system(attr_command);
     +               if (!attr_code)
     +                       continue;
     +///////////////////////////////////////////////
                     if (d->d_name[0] == '.' && !aflag && !Aflag)
                             continue;
                     else if (Aflag)
    

相关内容