Indica si una carpeta / archivo está oculto en Mac OS X

10

Sé que puede activar o desactivar la marca oculta de una carpeta / archivo haciendo chflags hidden foo.txty chflags nohidden foo.txt.

Pero, ¿hay alguna forma de saber si la carpeta / archivo está actualmente oculto o no?

No quiero simplemente determinar si la carpeta / archivo comienza con un punto.

Tyilo
fuente

Respuestas:

10

De acuerdo con la página de manual de ls , debería poder la -Oopción combinada con la -lopción de ver banderas con ls. Por ejemplo:

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

Editar: solo para dar una solución más específica a lo que quería el OP (ver comentarios a continuación): para ver si una carpeta está oculta o no, podemos pasar la -aopción a ls para ver la carpeta en sí. Luego podemos canalizar la salida sed -n 2p(gracias a Stack Overflow ) para obtener la línea requerida de esa salida. Un ejemplo:

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

Edición 2: para un comando que debería funcionar independientemente de si se trata de un archivo o una carpeta, debemos hacer algo un poco más hacky.

La línea de salida necesaria ls -alvaría dependiendo de si se trata de un archivo o una carpeta, ya que las carpetas muestran un recuento total, mientras que los archivos no. Para evitar esto, podemos buscar al personaje r. Esto debería estar en ~ todos los archivos / carpetas (casi todos deberían tener al menos un permiso de lectura), pero no en la línea de totales.

Como la línea que queremos obtener se convierte en la primera línea, podemos usarla head -n 1para obtener la primera línea (alternativa, si prefiere sed, sed -n 1ppodría usarse).

Entonces, por ejemplo con un directorio:

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 .

y con un archivo:

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

Edición 3: Vea la respuesta de Tyilo a continuación para una forma más agradable que grepping r:)

corbatas
fuente
Pero al hacer esto con una carpeta, se enumerarán las banderas para los archivos / carpetas debajo de ella
Tyilo
Para ver solo los archivos ocultos, canalícelo a través de grep (por ejemplo ls -Ol fooDir/ | grep hidden) para ver solo los archivos / carpetas ocultos. Esto todavía mostrará todos los archivos, pero si lo canaliza a través de un poco de magia sed / awk (alguien más tendrá que ayudar aquí, me temo), debería poder obtener solo una lista de archivos.
No quiero una lista de los archivos que solo quiero saber si la carpeta "foo" está oculta o no
Tyilo 18/08/11
Okay. Entonces, para ver el directorio en sí, agregue la -aopción a ls. Para obtener la línea que necesita de la salida, puede usar sed. Por ejemplo: ls -aOl foo | sed -n 2p. Esto mostrará una línea de salida. Si contiene la palabra "oculto", entonces foo está oculto. Si no lo hace, foo no está oculto. :)
2
El uso ls -Old dirname/le mostrará las propiedades del directorio en sí, no su contenido.
bahamat
7

Encontré la solución aquí: ¿Cómo puedo hacer que ls muestre información sobre el directorio especificado solamente, no información sobre sus subarchivos o el contenido de la carpeta?

Lo que básicamente es ls -ldO fooy luego solo añades | awk '{ print $5 }'para que muestre la información.

Tyilo
fuente
1
Tenga en cuenta que el awk se romperá si hay espacios en blanco en el nombre de usuario o nombre de grupo (que debería ser extremadamente improbable, pero bueno). Agregué una solución más segura que usa stat.
mrm
1

Como hace referencia @Tyilo , @Sorpigal sugiere probar stat, que codifica "banderas de usuario" con %Xf(he X codificó el usuario f lag), y es mucho más seguro para el análisis de máquina.

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

Los valores hexadecimales para las banderas del usuario viven aquí: grep UF /usr/include/sys/stat.h. A partir de 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
fuente