我希望在 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 权限与目录有关,这常常使人感到困惑,也许更好地理解它会对你有所帮助。对于目录,“读取”和“执行”权限(r
和x
)的含义与文件不同。对于目录,执行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
命令行仍会列出文件。
.hidden
创建一个以您想要隐藏文件的文件夹命名的文本文件。- 将要隐藏的文件或文件夹的名称(每行一个)添加到文件中。
- 刷新您的文件浏览器。
答案4
如果您有一些编程技能,并且您所需要的只是隐藏文件名以方便用户,以免混淆视觉空间,那么您可以破解它!
我将仅考虑命令行工具,因为它们非常统一并且是我经常使用的唯一工具。
存储这些信息的方法有很多种:
您可以在选定文件中存储“隐藏”扩展属性。请参阅
man attr
attr -s hidden -V true your_file
或者如上所述,您可以将文件名列表存储在
.hidden
文件中
重要的:这将不起作用,您必须实现逻辑,干净的系统只会忽略.hidden
文件和hidden
扩展属性!
此外,还有多种可能的实现:
如果你只有几个文件,请在
.bashrc
文件中写入alias ls='ls -I filename_1 -I filename_2'
man ls
了解更多信息。编写一个
function ls
这样的程序,它处理识别隐藏文件和汇编所有条目列表背后的所有逻辑-I
,然后/bin/ls
使用适当的忽略标志执行。这是一项非常费力的任务,因为您必须ls
正确处理所有参数。获取 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)