Fazendo ls ciente do sinalizador de arquivo "oculto"

11

É possível tornar ls ciente do sinalizador de arquivo hidden no Mac OS X?

Atualmente, um simples ls -lO produz:

$ ls -lO
total 0
drwxr-xr-x@  84 danielbeck  staff  -      2856 29 Mai 22:44 Applications
drwx------+ 158 danielbeck  staff  -      5372 29 Mai 15:27 Desktop
drwx------@ 250 danielbeck  staff  -      8500 30 Mai 20:40 Documents
drwx------+  11 danielbeck  staff  -       374 29 Mai 22:21 Downloads
drwx------@  84 danielbeck  staff  -      2856 29 Mai 22:48 Library
drwx------@   3 danielbeck  staff  hidden  102  3 Apr 20:45 Movies
drwx------@   5 danielbeck  staff  hidden  170  3 Apr 20:45 Music
drwx------+ 215 danielbeck  staff  -      7310 29 Mai 22:54 Pictures
drwxr-x---@   7 danielbeck  staff  hidden  238  3 Apr 20:45 Public
drwxr-xr-x@   4 danielbeck  staff  hidden  136 24 Apr 23:25 Sites

Portanto, temos três tipos de visibilidade: arquivos regulares e visíveis, arquivos com o sinalizador de arquivo hidden , que na verdade não estão ocultos no Terminal e arquivos ocultos cujos nomes começam com um ponto.

Existe uma maneira, por exemplo usando um alias ou uma função de shell confiável, para tornar os arquivos ls treat hidden flagged e .dothidden iguais, ou seja, ocultar por padrão e mostrar com ls -A ou ls -a , semelhante a como o Finder se comporta dependendo do valor de defaults read com.apple.Finder AppleShowAllFiles ?

Estou ciente de que man chflags menciona especificamente hidden flag apenas da GUI, ou seja, do Finder.

    
por Daniel Beck 30.05.2011 / 21:22

1 resposta

8

Estas são as etapas para obter um OS X ls , que oculta arquivos com o sinalizador oculto , a menos que a opção -a/-A seja especificada, semelhante aos arquivos dot.

  1. Instale o Xcode. Estou usando o Xcode 4.5.1 abaixo.
  2. Faça o download do release do seu SO, libutil e file_cmds , do link . Há um botão de download no lado direito de cada entrada da lista de pacotes. Este guia foi escrito para o OS X 10.8.2, YMMV, com as etapas exatas abaixo, se você estiver em uma versão diferente.
  3. Extraia os dois arquivos.
  4. Abra o file_cmds.xcodeproj no Xcode e selecione para criar o ls desejado.

  5. Selecioneoprojetofile_cmdsXcodeàesquerdaeselecioneametalsnaáreaprincipal.NaguiaConfiguraçõesdecompilação,procureCaminhosdepesquisadecabeçalhonacategoriaCabeçalhoseadicioneocaminhodapastaondevocêextraiulibutil.

  6. Abra o arquivo print.c na pasta ls à esquerda e remova a linha que diz #include <membershipPriv.h> . Salve o arquivo depois. Isso deve quebrar alguma coisa, porque includes estão lá por um motivo, mas ainda não determinei o que é.

  7. Abra o arquivo ls.c na mesma pasta e procure por um comentário dizendo /* Only display dot file if -a/-A set. */ na função display . Substitua-o e a condição abaixo dele com o seguinte:

    /* Only display dot file and file with hidden flag if -a/-A set. */
    sp = cur->fts_statp;
    if (((sp != NULL && (sp->st_flags & 0x8000)) || cur->fts_name[0] == '.') && !f_listdot) {
        cur->fts_number = NO_PRINT;
        continue;
    }
    
  8. Pressione Cmd - B para construir.

  9. SelecioneProdutosàesquerda(fimdalistadepastas)ecliquecomobotãodireitoemls.SelecioneMostrarnoFinder.

  10. Mova o executável ls para algum lugar conveniente, por exemplo seu diretório pessoal. Em seguida, abra o Terminal e execute sudo mv $HOME/ls /bin/ls ou, melhor ainda, crie uma nova pasta chamada bin no seu diretório pessoal e mova-a para lá. Adicione essa pasta ao seu PATH depois.

Testando o resultado:

$ mkdir test
$ cd test
$ touch foo bar
$ chflags hidden bar
$ /bin/ls -lO
total 0
-rw-r--r--@ 1 danielbeck  staff  hidden 0 25 Okt 22:25 bar
-rw-r--r--  1 danielbeck  staff  -      0 25 Okt 22:25 foo
$ $HOME/bin/ls -lO
total 0
-rw-r--r--  1 danielbeck  staff  - 0 25 Okt 22:25 foo
$ $HOME/bin/ls -A
bar foo
    
por 25.10.2012 / 22:24