Indiquez si un dossier / fichier est masqué sous Mac OS X

10

Je sais que vous pouvez définir ou désactiver le drapeau caché d'un dossier / fichier en faisant chflags hidden foo.txtet chflags nohidden foo.txt.

Mais est-il possible de dire si le dossier / fichier est actuellement masqué ou non?

Je ne veux pas simplement déterminer si le dossier / fichier commence par un point.

Tyilo
la source

Réponses:

10

Selon la page de manuel ls , vous devriez pouvoir -Ocombiner l' -loption avec l' option pour afficher les indicateurs avec ls. Par exemple:

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

Edit: Juste pour donner une solution plus spécifique à ce que l'OP voulait (voir les commentaires ci-dessous): Pour voir si un dossier est caché ou non, nous pouvons passer l' -aoption à ls pour afficher le dossier lui-même. Nous pouvons ensuite diriger la sortie vers sed -n 2p(merci Stack Overflow ) pour obtenir la ligne requise de cette sortie. Un exemple:

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

Edit 2: Pour une commande qui devrait fonctionner, qu'il s'agisse d'un fichier ou d'un dossier, nous devons faire quelque chose d'un peu plus hacky.

La ligne de sortie requise ls -alvarie selon qu'il s'agit d'un fichier ou d'un dossier, car les dossiers affichent un nombre total, contrairement aux fichiers. Pour contourner cela, nous pouvons chercher le personnage r. Cela devrait être dans ~ tous les fichiers / dossiers (presque tous devraient avoir au moins une autorisation de lecture), mais pas dans la ligne des totaux.

Comme la ligne que nous voulons obtenir devient alors la première ligne, nous pouvons utiliser head -n 1pour obtenir la première ligne (une alternative, si vous préférez sed, sed -n 1ppourrait être utilisée).

Ainsi, par exemple avec un répertoire:

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 .

et avec un fichier:

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: Voir la réponse de Tyilo ci-dessous pour une meilleure façon que de chercher r:)

hrickards
la source
Mais faire cela avec un dossier,
listera
Pour afficher uniquement les fichiers cachés, passez-le par grep (par exemple ls -Ol fooDir/ | grep hidden) pour afficher uniquement les fichiers / dossiers cachés. Cela montrera toujours tous les fichiers, mais si vous le faites passer par une magie sed / awk (quelqu'un d'autre devra m'aider ici, je le crains), vous devriez pouvoir obtenir juste une liste de fichiers.
Je ne veux pas une liste des fichiers que je veux juste savoir si le dossier "foo" est caché ou non
Tyilo
D'accord. Donc, pour afficher le répertoire lui-même, ajoutez l' -aoption à ls. Pour obtenir simplement la ligne dont vous avez besoin à partir de la sortie, vous pouvez utiliser sed. Par exemple: ls -aOl foo | sed -n 2p. Cela affichera une ligne de sortie. S'il contient le mot "caché", alors foo est caché. Si ce n'est pas le cas, foo n'est pas caché. :)
2
L'utilisation ls -Old dirname/vous montrera les propriétés du répertoire lui-même, pas son contenu.
bahamat
7

J'ai trouvé la solution ici: comment faire pour que ls affiche des informations sur le répertoire spécifié uniquement, pas des informations sur ses sous-fichiers ou le contenu du dossier?

Ce qui est fondamentalement ls -ldO fooet ensuite vous ajoutez juste | awk '{ print $5 }'pour lui faire afficher les informations.

Tyilo
la source
1
Sachez que l'awk se brisera s'il y a des espaces dans le nom d'utilisateur ou le nom de groupe (ce qui devrait être extrêmement improbable, mais bon). J'ai ajouté une solution plus sûre qui utilise stat.
mrm
1

Comme référencé par @Tyilo , @Sorpigal suggère d'essayer stat, qui code les "drapeaux utilisateur" avec %Xf(il a encodé X f utilisateur ), et est beaucoup plus sûr pour l'analyse de la machine.

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

Les valeurs hexagonales pour les drapeaux utilisateur vivent ici: grep UF /usr/include/sys/stat.h. Depuis 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
la source