現在、「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()
シェルと外部プロセスを分岐し、長いディレクトリリストを使用すると、著しく遅くなる可能性があります。
また、変更はls
ファイルのリストを提供できる他のプログラムには影響しません。find
、またはのように簡単にすることもできますprintf "%s\n" *
。