Dizer se uma pasta / arquivo está oculto no Mac OS X

10

Eu sei que você pode definir ou remover o sinalizador oculto de uma pasta / arquivo fazendo chflags hidden foo.txt e chflags nohidden foo.txt .

Mas existe alguma maneira de dizer se a pasta / arquivo está oculto ou não?

Eu não quero apenas determinar se a pasta / arquivo está começando com um ponto.

    
por Tyilo 18.08.2011 / 20:00

3 respostas

10

De acordo com o ls man page , você deve poder a opção -O combinada com a opção -l para visualizar flags com ls. Por exemplo:

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: Só para dar uma solução mais específica para o que o OP queria (veja os comentários abaixo): Para ver se uma pasta está oculta ou não, podemos passar a opção -a para ls para ver a pasta em si. Podemos, então, canalizar a saída para sed -n 2p (obrigado Stack Overflow ) para obter a linha necessária dessa saída. Um exemplo:

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

Editar 2: Para um comando que deve funcionar independentemente de ser um arquivo ou uma pasta, precisamos fazer algo um pouco mais hacky.

A linha de saída necessária de ls -al varia dependendo se a coisa é um arquivo ou pasta, pois as pastas mostram uma contagem total, enquanto os arquivos não. Para contornar isso, podemos grep para o caractere r . Isso deve estar em ~ todos os arquivos / pastas (quase todos devem ter pelo menos uma permissão de leitura), mas não na linha de totais.

Como a linha que queremos obter se torna a primeira linha, podemos usar head -n 1 para obter a primeira linha (alternativa, se você preferir sed, sed -n 1p poderia ser usado).

Então, por exemplo, com um diretório:

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 .

e com um arquivo:

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

Edite 3: Veja a resposta de Tyilo abaixo para uma maneira mais agradável do que grepping para r :)

    
por 18.08.2011 / 20:13
7

Encontrou a solução aqui: link

Que basicamente é ls -ldO foo e, em seguida, basta anexar | awk '{ print $5 }' para exibir as informações

    
por 18.08.2011 / 21:02
1

Como mencionado por @Tyilo , @ Sorpigal sugere a tentativa de stat , que codifica" flags do usuário "com %Xf (ele X usuário codificado f lag ), e é muito mais seguro para análise de máquina.

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

Os valores hexadecimais para sinalizadores de usuário estão aqui: grep UF /usr/include/sys/stat.h . A partir do 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 */
    
por 17.04.2018 / 19:21

Tags