Answers:
你不能。文件系统处理隐藏设置的方式存在根本差异。在Windows中,文件系统在元数据中存储文件的几个属性,包括“隐藏”和“系统”属性(两者都是隐藏文件)。在常见的* nix文件系统中,不存储任何此类属性。而是必须将信息放在其他位置,例如文件名中。因此,约定是以。开头的文件。(根据您的系统,默认情况下,大多数工具不会显示(取决于_)。
纯粹是为了方便起见。以文件名开头绝对没有什么意义,只是“用户可能不想一直看到它”。为了确保您知道,运行eg ls -a
将显示所有文件。
如果您不想让文件在Linux上混乱,则应将其重命名为以点开头(奖金:如果我们谈论的是便携式设备,这也适用于OS X)。如果您不希望用户能够找到文件,则说明您做错了-这就是权限的用途。
与目录有关的Unix权限通常会使人们感到困惑,也许更好地理解它会对您有所帮助。“读取”和“执行”权限(r
和x
)对目录的含义与对文件的含义不同。对于目录,执行x
许可权决定是否访问目录中的索引节点。读取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显示错误,因为它无法获取文件属性),但是我无法切换到目录或读取其中的文件。没有读取,我无法列出文件,但是我仍然可以进入目录,如果知道文件名,我仍然可以访问它。
不过请注意,删除读取权限只会给您带来晦涩难懂的安全性。如果用户猜中了文件名,他们将能够读取其内容。
这可能与您的问题无关,我只是想确保您了解目录权限。
.hidden
在目录中创建一个文件,其中包含要隐藏的文件的名称(每行一个名称)。
然后将以下内容添加到您的~/.bashrc
:
ls () {
if [ -f .hidden ]; then
declare GLOBIGNORE="$GLOBIGNORE:.*:$(tr '\n' ':' < .hidden)"
ls "$@"
fi
}
现在,您的ls
命令不会列出这些文件。
我使用这种技术来隐藏我__pycache__
和__init__.py
文件。
编辑:根据其他评论,这也将它们隐藏在至少一个(Nautilus)中,但也可能隐藏在多个GUI文件浏览器中。
ls -al
吗?
实际上,您可以在Linux中隐藏文件而无需添加点。这实际上将它们隐藏在Nautilus中。一个ls
命令行仍然会列出文件。
.hidden
在要隐藏文件的文件夹中创建一个名为的文本文件。ls
列表中。
您是否只是在试图从图形用户界面的文件管理器和/或桌面环境中隐藏文件?如果是这样,除了简单地在文件名前加点号之外,可能还有其他选择。
我相信任何Linux的文件管理器隐藏的唯一附加文件的备份文件,即那些在波浪结束~
或.bak
或任何他们认为是备份扩展。无论如何,如果您只想从文件管理器中隐藏备份文件,那么可能很幸运。
不要给您的文件添加备份扩展名以隐藏它们,否则它们可能会被意外删除!
顺便说一句,您可以使用命令SetFile -a V [file]
或编辑从Mac OS X中的Finder隐藏文件,/.hidden
但是显然,这不会从命令行ls
程序中隐藏文件。
chflags hidden filename
。
如果您具有一些编程技能,并且只要隐藏文件名以方便用户使用,就可以避免混乱的视觉空间,那么您就可以破解它!
我将仅考虑命令行工具,因为它们非常统一,并且是我经常使用的唯一工具。
有很多方法可以存储此信息:
您可以在所选文件中存储“隐藏”扩展属性。看到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
我在不到5分钟的时间内使用了无懈可击的资源对其进行了入侵,而diff如下所示:
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)
ls.c
在于src
,不是根目录下,并没有什么作用lsdir
的ls.c
。
您可以通过删除组的“ x”权限或其他方式来“隐藏”目录的内容chmod go-x directoryname
。尽管您知道确切的路径也可以访问文件,但是您无法再列出文件。这听起来不像您想要的。
请记住,dotfile是一种方便,并不是为了安全起见真正隐藏文件,而是减少了文件列表期间文件的混乱情况。它已嵌入ls
其他工具中。