Informar se uma pasta / arquivo está oculta no Mac OS X

10

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

Mas existe alguma maneira de saber se a pasta / arquivo está atualmente oculta ou não?

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

Tyilo
fonte

Respostas:

10

De acordo com a página de manual ls , você deve poder -Ocombinar a -lopção com a opção de exibir sinalizadores 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

Editar: Apenas para fornecer uma solução mais específica para o que o OP queria (veja os comentários abaixo): Para verificar se uma pasta está oculta ou não, podemos passar a -aopção para ls para visualizar a própria pasta. Podemos então canalizar a saída sed -n 2p(graças ao 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 .

Edit 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 ls -alvaria de acordo com a coisa ser um arquivo ou uma pasta, pois as pastas mostram uma contagem total, enquanto os arquivos não. Para contornar isso, podemos cumprimentar o personagem 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, podemos usar head -n 1a primeira (alternativa, se você preferir o sed, sed -n 1ppode ser usada).

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

Edit 3: Veja a resposta de Tyilo abaixo para uma maneira melhor do que grepping para r:)

hrickards
fonte
Mas fazer isso com uma pasta, irá listar as bandeiras para os arquivos / pastas sob ele
Tyilo
Para apenas visualizar arquivos ocultos, passe-o através do grep (por exemplo ls -Ol fooDir/ | grep hidden) para visualizar apenas arquivos / pastas ocultos. Isso ainda mostrará todos os arquivos, mas se você passar por alguma mágica sed / awk (alguém mais terá que ajudar aqui, receio), você poderá obter apenas uma lista de arquivos.
Eu não quero uma lista dos arquivos que eu só quero saber é a pasta "foo" está escondido ou não
Tyilo
Está bem. Portanto, para visualizar o próprio diretório, adicione a -aopção a ls. Para obter a linha que você precisa da saída, use sed. Por exemplo: ls -aOl foo | sed -n 2p. Isso exibirá uma linha de saída. Se ele contiver a palavra "oculto", então foo está oculto. Caso contrário, foo não está oculto. :)
2
O uso ls -Old dirname/mostrará as propriedades do próprio diretório, não seu conteúdo.
bahamat
7

Encontre a solução aqui: Como posso fazer com que o ls mostre informações apenas sobre o diretório especificado, não informações sobre seus subarquivos ou conteúdo da pasta?

O que basicamente é ls -ldO fooe então você apenas anexa | awk '{ print $5 }'para que ele exiba as informações.

Tyilo
fonte
1
Esteja ciente de que o awk será interrompido se houver espaço em branco no nome de usuário ou no nome do grupo (o que deve ser extremamente improvável, mas ei). Eu adicionei uma solução mais segura que usa stat.
Mrm 17/04
1

Conforme referenciado por @Tyilo , o @Sorpigal sugere tentar stat, que codifica "sinalizadores de usuário" com %Xf(ele codifica X usuário f lag) e é muito mais seguro para a análise de máquinas.

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

Os valores hexadecimais para bandeiras de usuários viver aqui: grep UF /usr/include/sys/stat.h. No 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 */
srm
fonte