Stellen Sie fest, ob ein Ordner / eine Datei in Mac OS X ausgeblendet ist

10

Ich weiß, dass Sie das versteckte Flag eines Ordners / einer Datei mit chflags hidden foo.txtoder setzen können chflags nohidden foo.txt.

Aber kann man trotzdem sagen, ob der Ordner / die Datei derzeit versteckt ist oder nicht?

Ich möchte nicht nur feststellen, ob der Ordner / die Datei mit einem Punkt beginnt.

Tyilo
quelle

Antworten:

10

Laut der Manpage ls sollten Sie in der Lage sein, die -OOption mit der -lOption zu kombinieren , Flags mit ls anzuzeigen. Beispielsweise:

ls -Ol foo.txt
-rw-r--r-- 1 harry staff - 0 18 Aug 19:11 foo.txt
chflags hidden foo.txt
ls -Ol foo.txt
-rw-r--r-- 1 harry staff hidden 0 18 Aug 19:11 foo.txt
chflags nohidden foo.txt
ls -Ol foo.txt
-rw-r--r-- 1 harry staff - 0 18 Aug 19:11 foo.txt

Bearbeiten: Nur um eine spezifischere Lösung für das zu finden, was das OP wollte (siehe Kommentare unten): Um zu sehen, ob ein Ordner ausgeblendet ist oder nicht, können wir die -aOption an ls übergeben, um den Ordner selbst anzuzeigen. Wir können dann die Ausgabe in sed -n 2p(dank Stack Overflow ) weiterleiten , um die erforderliche Zeile dieser Ausgabe zu erhalten. Ein Beispiel:

mkdir foo
chflags hidden foo
ls -aOl foo | sed -n 2p
drwxr-xr-x@ 2 harry staff hidden 68 18 Aug 19:11 .

Bearbeiten 2: Für einen Befehl, der unabhängig davon funktionieren soll, ob es sich um eine Datei oder einen Ordner handelt, müssen wir etwas Hackigeres tun.

Die erforderliche Ausgabezeile von ls -alhängt davon ab, ob es sich um eine Datei oder einen Ordner handelt, da Ordner eine Gesamtanzahl aufweisen, Dateien hingegen nicht. Um dies zu umgehen, können wir nach dem Charakter suchen r. Dies sollte in ~ allen Dateien / Ordnern sein (fast alle sollten mindestens eine Leseberechtigung haben), aber nicht in der Summenzeile.

Da die Zeile, die wir erhalten möchten, zur ersten Zeile wird, können wir head -n 1die erste Zeile verwenden (alternativ kann eine Alternative verwendet werden, wenn Sie sed bevorzugen sed -n 1p).

Also zum Beispiel mit einem Verzeichnis:

mkdir foo
chflags hidden foo
ls -aOl foo | grep r | head -n 1
drwxr-xr-x@ 2 harry staff hidden 68 18 Aug 19:11 .

und mit einer Datei:

touch foo.txt
chflags hidden foo.txt
ls -aOl foo.txt | grep r | head -n 1
-rw-r--r-- 1 harry staff hidden 0 18 Aug 19:11 foo.txt

Edit 3: Siehe Tyilos Antwort unten für eine schönere Art als nach zu greifen r:)

hrickards
quelle
Wenn
Um nur versteckte Dateien anzuzeigen, leiten Sie sie durch grep (z. B. ls -Ol fooDir/ | grep hidden), um nur versteckte Dateien / Ordner anzuzeigen. Dies zeigt immer noch alle Dateien an, aber wenn Sie es durch eine sed / awk-Magie leiten (ich fürchte, jemand anderes muss hier helfen), sollten Sie in der Lage sein, nur eine Liste von Dateien zu erhalten.
Ich möchte keine Liste der Dateien, die ich nur wissen möchte,
ob der
In Ordnung. Um das Verzeichnis selbst anzuzeigen, fügen Sie die -aOption zu ls hinzu. Um nur die gewünschte Zeile aus der Ausgabe zu erhalten, können Sie sed verwenden. Zum Beispiel : ls -aOl foo | sed -n 2p. Dies zeigt eine Ausgabezeile an. Wenn es das Wort "versteckt" enthält, ist foo versteckt. Wenn dies nicht der Fall ist, wird foo nicht ausgeblendet. :)
2
Mit ls -Old dirname/wird Ihnen die Eigenschaften des Verzeichnisses selbst angezeigt, nicht dessen Inhalt.
Bahamat
7

Die Lösung wurde hier gefunden: Wie kann ich festlegen, dass nur Informationen zu dem angegebenen Verzeichnis angezeigt werden, nicht Informationen zu den Unterdateien oder zum Ordnerinhalt?

Was im Grunde ist ls -ldO foound dann fügen Sie einfach hinzu | awk '{ print $5 }', damit es die Informationen anzeigt.

Tyilo
quelle
1
Beachten Sie, dass die awk unterbrochen wird, wenn der Benutzername oder Gruppenname Leerzeichen enthält (was äußerst unwahrscheinlich sein sollte, aber hey). Ich habe eine sicherere Lösung hinzugefügt, die verwendet stat.
Herr
1

Wie durch referenzierte @Tyilo , @Sorpigal schlägt versucht stat, die codiert „User Flags“ mit %Xf(er X Anwender codiert f Verzögerung), und für die Maschinen Parsing viel sicherer ist.

$ stat -f "%Xf" ~/Library
8000

Die Hex-Werte für Benutzerflags leben hier : grep UF /usr/include/sys/stat.h. Ab macOS 10.11:

#define UF_SETTABLE     0x0000ffff  /* mask of owner changeable flags */
#define UF_NODUMP       0x00000001  /* do not dump file */
#define UF_IMMUTABLE    0x00000002  /* file may not be changed */
#define UF_APPEND       0x00000004  /* writes to file may only append */
#define UF_OPAQUE       0x00000008  /* directory is opaque wrt. union */
/* #define UF_NOUNLINK  0x00000010 */   /* file may not be removed or renamed */
#define UF_COMPRESSED   0x00000020  /* file is hfs-compressed */
/* UF_TRACKED is used for dealing with document IDs.  We no longer issue
   notifications for deletes or renames for files which have UF_TRACKED set. */
#define UF_TRACKED      0x00000040
#define UF_HIDDEN       0x00008000  /* hint that this item should not be */
mrm
quelle