我目前正在尝试修改“ls.c”源文件以隐藏包含该词的文件和文件夹隐。经过一些研究后,我发现通过将此代码添加到“ls.c”源文件中可以实现这一点:
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;
必须在以下行之后添加此代码:
while ((d = readdir(dp))) {
我们可以通过 'git clone git://git.suckless.org/sbase' 获取 coreutils 源文件(包括 ls.c)
因此,在使用修改后的“ls.c”源文件运行“make”后,“隐藏”文件仍然显示。
我需要修改“ls.c”以真正隐藏文件和文件夹。
答案1
命令attr
处理扩展属性,特别是与 XFS 文件系统相关的。 (它也适用于 ext4,但我认为getfattr
它setfattr
适用于一般的、独立于文件系统的用途。)
也就是说,attr -Lqg hidden "$filename"
不检查有关文件的任何内容姓名hidden
,但它会检查文件上是否设置了调用的扩展属性。
如果您想检查文件名是否包含特定字符串,您可能应该使用功能strstr()
。
由于d->d_name
包含正在处理的文件的名称,因此类似的操作可能会起作用。
if (strstr(d->d_name, "hidden") == 0) { ...
这并不意味着您不能基于扩展属性隐藏文件......但即使您这样做,最好查找用于此目的的实际系统调用。system()
分叉出一个 shell 和外部进程,并且目录列表很长,这可能会明显很慢。
另请注意,修改ls
对其他也可以提供文件列表的程序没有任何作用。它们可能像find
, 或 一样简单printf "%s\n" *
。
答案2
好吧,我找到了一种解决方法,通过在第 261 行之后的“ls.c”中添加以下行来“隐藏”“ls”的字符串(感谢 ilkkachu 在下面的回答):
if (strstr(d->d_name, "HIDDEN") == 0)
return 0;
可能不是最好的解决方案,但嘿它有效:)
如果有人想提出更好的选择/解决方案,请这样做,如果可能的话,我希望有更多的选择和更好的选择!
谢谢