Ich möchte Dateien unter Linux ausblenden, ohne den Punkt zu verwenden, da dies unter Windows möglich ist.
Gibt es eine Möglichkeit, dies zu tun?
Ich möchte Dateien unter Linux ausblenden, ohne den Punkt zu verwenden, da dies unter Windows möglich ist.
Gibt es eine Möglichkeit, dies zu tun?
Antworten:
Du kannst nicht. Es gibt einen grundlegenden Unterschied in der Art und Weise, wie die Dateisysteme mit versteckten Einstellungen umgehen. In Windows speichert das Dateisystem mehrere Attribute für die Datei in Metadaten, einschließlich der Attribute "hidden" und "system" (beide Arten von versteckten Dateien). In gängigen * nix-Dateisystemen wird kein solches Attribut gespeichert. Stattdessen müssen die Informationen an einer anderen Stelle abgelegt werden, beispielsweise im Dateinamen. Die Konvention ist also, dass Dateien mit beginnen. (und abhängig von Ihrem System werden möglicherweise einige andere wie _) von den meisten Tools standardmäßig nicht angezeigt.
Dies dient lediglich der Bequemlichkeit. Der Anfang eines Dateinamens bedeutet absolut nichts, aber "der Benutzer möchte dies wahrscheinlich nicht die ganze Zeit sehen." Um sicherzustellen, dass Sie es wissen, werden beim Ausführen von zB ls -a
alle Dateien angezeigt.
Wenn Sie nicht möchten, dass Ihre Einträge in Linux durch eine Datei unübersichtlich werden, sollten Sie diese umbenennen, um mit einem Punkt zu beginnen (Bonus: Dies funktioniert auch für OS X, wenn es sich um ein tragbares Gerät handelt). Wenn Sie nicht möchten, dass Benutzer eine Datei finden, machen Sie es falsch - dafür sind Berechtigungen vorgesehen.
Unix-Berechtigungen, wie sie sich auf Verzeichnisse beziehen, verwirren die Leute oft, und vielleicht hilft es Ihnen, sie besser zu verstehen. Die Berechtigungen "Lesen" und "Ausführen" ( r
und x
) bedeuten für Verzeichnisse etwas anderes als für Dateien. Für Verzeichnisse bestimmt die Ausführungsberechtigung x
, ob Sie auf die Inodes im Verzeichnis zugreifen oder nicht. Die Leseberechtigung bestimmt, r
ob Sie auf die Auflistung des Verzeichnisses zugreifen können oder nicht. Funktionell x
ermöglicht es dem Benutzer, Dinge in einem Verzeichnis zu tun, während die r
Berechtigung es ihm ermöglicht, zu sehen, was sich darin befindet. Diese sind unterschiedlich und der Unterschied kann verwirrend sein. Schauen wir uns ein Beispiel an:
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 ..
Beachten Sie also, dass ich die Dateien auch ohne execute auflisten kann (obwohl ls einen Fehler anzeigt, weil die Dateieigenschaften nicht abgerufen werden können), aber ich kann nicht in das Verzeichnis wechseln oder die Dateien darin lesen. Ohne Lesen kann ich die Dateien nicht auflisten, aber ich kann trotzdem in das Verzeichnis wechseln, und wenn ich den Namen einer Datei kenne, kann ich trotzdem darauf zugreifen.
Beachten Sie jedoch, dass das Entfernen der Leseberechtigung Ihnen nur Sicherheit durch Unbekanntheit gibt. Wenn der Benutzer den Dateinamen errät, kann er dessen Inhalt lesen.
Dies war möglicherweise nicht wirklich relevant für Ihre Frage. Ich wollte nur sicherstellen, dass Sie die Verzeichnisberechtigungen verstanden haben.
Erstellen Sie .hidden
im Verzeichnis eine Datei mit den Namen der Dateien, die ausgeblendet werden sollen (ein Name pro Zeile).
Fügen Sie dann Folgendes hinzu ~/.bashrc
:
ls () {
if [ -f .hidden ]; then
declare GLOBIGNORE="$GLOBIGNORE:.*:$(tr '\n' ':' < .hidden)"
ls "$@"
fi
}
Jetzt ls
listet Ihr Befehl diese Dateien nicht mehr auf.
Ich verwende diese Technik, um meine __pycache__
und __init__.py
Dateien zu verstecken .
BEARBEITEN: Laut einem anderen Kommentar werden sie auch in mindestens einem (Nautilus), wahrscheinlich aber auch in mehreren GUI-Dateibrowsern versteckt.
ls -al
?
Sie können Dateien in Linux tatsächlich ausblenden, ohne einen Punkt hinzuzufügen. Dies verbirgt sie tatsächlich in Nautilus; In ls
der Befehlszeile werden die Dateien weiterhin aufgelistet.
.hidden
in dem Ordner, in dem Sie die Dateien ausblenden möchten.ls
Listen.
Ein Punkt wird verwendet, um Dateien unter Linux auszublenden. Dies kann nicht geändert werden.
Sie können jedoch mit den Dateiberechtigungen spielen, um zu verhindern, dass Benutzer auf bestimmte Ordner / Dateien zugreifen können. Versuchen Sie, mit dem chmod
Befehl zu experimentieren .
Versuchen Sie nur, Dateien aus dem Dateimanager und / oder der Desktop-Umgebung Ihrer grafischen Benutzeroberfläche auszublenden? In diesem Fall gibt es möglicherweise Optionen, die über das einfache Präfixieren des Dateinamens mit einem Punkt hinausgehen.
Ich glaube , die nur zusätzliche Dateien von jedem Linux - Dateimanager versteckt sind Backup - Dateien, dh diejenigen , die in einer Tilde enden ~
oder .bak
oder was auch immer sie glauben , dass die Backup - Erweiterung. In jedem Fall haben Sie wahrscheinlich Glück, wenn Sie Sicherungsdateien nur vor dem Dateimanager verstecken möchten.
Geben Sie Ihren Dateien keine Backup-Erweiterung, um sie zu verbergen, da sie sonst versehentlich gelöscht werden könnten!
Abgesehen davon können Sie Dateien mit dem Befehl SetFile -a V [file]
oder durch Bearbeiten im Finder von Mac OS X /.hidden
ausblenden, aber dies wird die Datei natürlich nicht aus dem Kommandozeilenprogramm ausblenden ls
.
chflags hidden filename
.
Wenn Sie einige Programmierkenntnisse haben und nur Dateinamen für die Benutzerfreundlichkeit verbergen müssen, um den visuellen Raum nicht zu überladen, können Sie ihn hacken!
Ich werde nur Kommandozeilen-Tools betrachten, da sie ziemlich einheitlich sind und die einzigen Werkzeuge sind, die ständig von mir benutzt werden.
Es gibt viele Möglichkeiten, diese Informationen zu speichern:
Sie können "versteckte" erweiterte Attribute in ausgewählten Dateien speichern. Sehenman attr
attr -s hidden -V true your_file
Oder wie oben erwähnt, können Sie die Liste der Dateinamen in der .hidden
Datei speichern
Wichtig: Dies funktioniert nicht ohne weiteres, Sie müssen die Logik implementieren, saubere Systeme ignorieren einfach .hidden
Dateien und hidden
erweiterte Attribute!
Es gibt auch mehrere mögliche Implementierungen:
Wenn Sie nur wenige Dateien haben, schreiben Sie diese in Ihre .bashrc
Datei
alias ls='ls -I filename_1 -I filename_2'
man ls
für mehr Informationen.
Schreiben Sie ein function ls
solches, das die gesamte Logik zum Erkennen versteckter Dateien und Zusammenstellen der Liste aller -I
Einträge verarbeitet und dann /bin/ls
mit den richtigen Ignorierflags ausführt
. Sehr mühsame Aufgabe, da man alle ls
Parameter richtig handhaben muss .
Holen Sie sich Quellen von Coreutils
git clone git://git.sv.gnu.org/coreutils
oder
git clone git://git.suckless.org/sbase
Patche es so, wie du es brauchst, um versteckte Dateien zu implementieren. Und platziere es in deinemPATH
Ich habe es in weniger als 5 Minuten mit sauglosen Quellen gehackt und diff sieht so aus:
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
liegt in src
, nicht im Stammverzeichnis, und es gibt keine Funktion lsdir
in ls.c
.
Dies ist die beste Lösung, die ich gefunden habe. Fügen Sie Ihrem Profil Folgendes hinzu :
alias ls="/bin/ls --color=auto --ignore='*.egg-info' --ignore='__pycache__'"
Wenn Sie mehr Muster benötigen, fügen Sie einfach mehr --ignore
Flags hinzu.
Heutzutage können Sie FUSE schreiben , das Dateien entsprechend der gegebenen Konfiguration versteckt.
Dieser Artikel lässt mich glauben, dass Sie die getdir
Funktion optimieren müssen:
getdir: int (*getdir) (const char *, fuse_dirh_t, fuse_dirfil_t);
Dies liest den Inhalt eines Verzeichnisses. Diese Operation ist dieopendir()
,readdir()
, ...,closedir()
Sequenz in einem Aufruf. Für jeden Verzeichniseintrag sollte diefilldir()
Funktion aufgerufen werden.
Ich bin kein Programmierer, aber ich stelle mir vor, man könnte getdir
alle in (zB) .hidden
Datei aufgelisteten Dateien weglassen . Wenn Sie dies korrekt implementieren, ist jedes Tool (GUI oder nicht) betroffen.
Sie können ‚verstecken‘ der Inhalt eines Verzeichnisses durch Wegnehmen ‚x‘ perms für die Gruppe oder andere: chmod go-x directoryname
. Sie können keine Dateien mehr auflisten, obwohl Sie auf eine Datei zugreifen können, wenn Sie den genauen Pfad kennen. Das hört sich nicht so an, wie Sie es wollen.
Denken Sie daran, dass die Funktion dotfile praktisch ist, um die Datei aus Sicherheitsgründen nicht wirklich auszublenden, sondern um die Unordnung bei der Dateiauflistung zu verringern. Es ist in ls
und die anderen Werkzeuge eingebrannt .