Verstecke Dateien unter Linux ohne den Punkt

32

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?

aWebDeveloper
quelle
6
Denken Sie daran, das Verbergen von Dateien (Verschleierung) ersetzt nicht die Sicherheit (Zugriffsbeschränkung)
uSlackr

Antworten:

26

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 -aalle 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" ( rund 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, rob Sie auf die Auflistung des Verzeichnisses zugreifen können oder nicht. Funktionell xermöglicht es dem Benutzer, Dinge in einem Verzeichnis zu tun, während die rBerechtigung 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.

jcrawfordor
quelle
26

Erstellen Sie .hiddenim 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 lslistet Ihr Befehl diese Dateien nicht mehr auf.

Ich verwende diese Technik, um meine __pycache__und __init__.pyDateien zu verstecken .


BEARBEITEN: Laut einem anderen Kommentar werden sie auch in mindestens einem (Nautilus), wahrscheinlich aber auch in mehreren GUI-Dateibrowsern versteckt.

Eine Gr
quelle
es ist interessant. Funktioniert es auch im Nautilus oder anderen GUI-Tools? Können Sie die Dateien mit sehen ls -al?
Jakuje,
1
Code fehlt ein "" am Ende. (und falls Sie sich fragen, wo die Upvotes herkommen: askubuntu.com/a/713591/15811 ) ;-)
Rinzwind
14

Sie können Dateien in Linux tatsächlich ausblenden, ohne einen Punkt hinzuzufügen. Dies verbirgt sie tatsächlich in Nautilus; In lsder Befehlszeile werden die Dateien weiterhin aufgelistet.

  1. Erstellen Sie eine Textdatei mit dem Namen .hiddenin dem Ordner, in dem Sie die Dateien ausblenden möchten.
  2. Fügen Sie der Datei die Namen der Dateien oder Ordner hinzu, die Sie ausblenden möchten (eine pro Zeile).
  3. Aktualisieren Sie Ihren Dateibrowser.
Machen
quelle
2
funktioniert hier nicht mit "ls" in debian 5.0. Ist es spezifisch für Nautilus oder Delphin oder ...?
Tim Haegele
2
Dateien sind in Nautilus versteckt. nicht in lsListen.
zu tun
1
einfach super lösung! :)
Merianos Nikos
4

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 chmodBefehl zu experimentieren .

bbaja42
quelle
2

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 .bakoder 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 /.hiddenausblenden, aber dies wird die Datei natürlich nicht aus dem Kommandozeilenprogramm ausblenden ls.

Jeff Burdges
quelle
3
In OS X können Sie Dateien auch durch verstecken chflags hidden filename.
Slhck
2

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:

  1. Sie können "versteckte" erweiterte Attribute in ausgewählten Dateien speichern. Sehenman attr

      attr -s hidden -V true your_file
    
  2. Oder wie oben erwähnt, können Sie die Liste der Dateinamen in der .hiddenDatei speichern

Wichtig: Dies funktioniert nicht ohne weiteres, Sie müssen die Logik implementieren, saubere Systeme ignorieren einfach .hiddenDateien und hiddenerweiterte Attribute!

Es gibt auch mehrere mögliche Implementierungen:

  1. Wenn Sie nur wenige Dateien haben, schreiben Sie diese in Ihre .bashrcDatei

    alias ls='ls -I filename_1 -I filename_2'
    

    man ls für mehr Informationen.

  2. Schreiben Sie ein function lssolches, das die gesamte Logik zum Erkennen versteckter Dateien und Zusammenstellen der Liste aller -IEinträge verarbeitet und dann /bin/lsmit den richtigen Ignorierflags ausführt . Sehr mühsame Aufgabe, da man alle lsParameter richtig handhaben muss .

  3. 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)
    
Aleksy Grabowski
quelle
ls.cliegt in src, nicht im Stammverzeichnis, und es gibt keine Funktion lsdirin ls.c.
Melab
2

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 --ignoreFlags hinzu.

jsmedmar
quelle
Dies führt zu einer sehr, sehr langen Zeichenfolge, wenn mehr als einige Dateien ausgeblendet werden müssen. Für mehrere Dateien gibt es effizientere Möglichkeiten, aber für einige Dateien ist dies dennoch eine gute Lösung.
JW0914,
2

Heutzutage können Sie FUSE schreiben , das Dateien entsprechend der gegebenen Konfiguration versteckt.

Dieser Artikel lässt mich glauben, dass Sie die getdirFunktion optimieren müssen:

getdir: int (*getdir) (const char *, fuse_dirh_t, fuse_dirfil_t);
Dies liest den Inhalt eines Verzeichnisses. Diese Operation ist die opendir(), readdir(), ..., closedir()Sequenz in einem Aufruf. Für jeden Verzeichniseintrag sollte die filldir()Funktion aufgerufen werden.

Ich bin kein Programmierer, aber ich stelle mir vor, man könnte getdiralle in (zB) .hiddenDatei aufgelisteten Dateien weglassen . Wenn Sie dies korrekt implementieren, ist jedes Tool (GUI oder nicht) betroffen.

Kamil Maciorowski
quelle
1

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 lsund die anderen Werkzeuge eingebrannt .

Reiche Homolka
quelle
Und es ist auch falsch. Während das Entfernen von Leseberechtigungen aus einem Verzeichnis Sie daran hindert, seinen Inhalt aufzulisten, verweigert das Entfernen der Ausführungsberechtigung jeglichen Zugriff auf das Verzeichnis. Wenn Sie keine Berechtigung zum Ausführen eines Verzeichnisses haben, haben Sie über dieses hinaus keinen Zugriff. Nicht einmal, wenn es ein Unterverzeichnis mit vollen Rechten gibt und Sie den Pfad kennen.
Bachsau