maneira simples de descrever / marcar arquivos no bash

0

Existe uma maneira rápida e simples de marcar arquivos no bash para que uma lista como esta

-rw------- 1 root   88039 Sep 29 16:31 7CCE2EC3-3191-4379-C036-1C48CCCE4C6C
-rw------- 1 root 1985554 Sep 27 16:09 61C6DCDC-04C6-5137-8894-2C8930251D1E
-rw------- 1 root  248965 Sep 26 14:12 22384DC7-D60E-57CC-94C2-C5301C980990
-rw------- 1 root  293908 Sep 22 18:27 C14E6C74-C301-49CC-C625-070721CC47C1
-rw------- 1 root  120965 Sep 19 19:17 2407C1C5-D09C-41E1-9080-C2CC8C86D0CC
-rw------- 1 root   20036 Sep 13 18:32 78691D77-C4E6-4ED1-8119-C09CCC194892
-rw------- 1 root   11789 Sep 12 23:16 8C8C190C-5340-421C-96D1-D4111C5E062C
-rw------- 1 root    1884 Sep 11 22:07 CCC91959-9744-4339-9C99-0C75E301090C

torna-se algo parecido com isto (ou similar)

-rw------- 1 root   88039 Sep 29 16:31 7CCE2EC3-3191-4379-C036-1C48CCCE4C6C
-rw------- 1 root 1985554 Sep 27 16:09 61C6DCDC-04C6-5137-8894-2C8930251D1E
-rw------- 1 root  248965 Sep 26 14:12 22384DC7-D60E-57CC-94C2-C5301C980990 -> MYOLDFILE1
-rw------- 1 root  293908 Sep 22 18:27 C14E6C74-C301-49CC-C625-070721CC47C1
-rw------- 1 root  120965 Sep 19 19:17 2407C1C5-D09C-41E1-9080-C2CC8C86D0CC -> MYNEWFILE.TXT
-rw------- 1 root   20036 Sep 13 18:32 78691D77-C4E6-4ED1-8119-C09CCC194892
-rw------- 1 root   11789 Sep 12 23:16 8C8C190C-5340-421C-96D1-D4111C5E062C -> hello.c
-rw------- 1 root    1884 Sep 11 22:07 CCC91959-9744-4339-9C99-0C75E301090C

Eu tentei fazer algo com ln -s mas depois acabei com muitas duplicatas porque os links estão no mesmo diretório e para obter uma visão legal eu devo filtrar ls com grep. qualquer ajuda apreciada

    
por Edoardo 02.10.2017 / 16:56

1 resposta

1

Eu não acho que você possa usar (fidedignamente) qualquer recurso disponível para fazer com que ls (com ou sem opções) regular faça o que você quiser. Você precisa redefinir ls com um script, uma função ou um alias.

Eu não redefiniria ls em si, pelo menos não neste exemplo, que deve ser uma simples prova de conceito . Suportar opções de linha de comando de ls tornaria o exemplo excessivamente complexo.

Para implementar minha solução, você precisa de um sistema de arquivos que suporte atributos e ferramentas estendidos para manipulá-los (por exemplo, apt-get install attr no Debian).

Para definir o atributo:

setfattr -n user.mytag -v "hello.c" "8C8C190C-5340-421C-96D1-D4111C5E062C"

Nota: mytag é um nome arbitrário. Escolha um e cumpra-o.

Para remover o atributo:

setfattr -x user.mytag "8C8C190C-5340-421C-96D1-D4111C5E062C"

Você pode criar scripts ou funções personalizadas para fazer isso de uma maneira mais conveniente. Agora digamos que você escolha ll para fazer o que quiser. Se é um alias, você precisa primeiro de unalias:

unalias ll

Em seguida, defina uma função:

function ll() { find "$@" -maxdepth 1 -exec \
   sh -c '
      a=$(getfattr -n user.mytag --only-values "$1" 2>/dev/null)
      ls -dalF -- "$1" | tr -d "\n"
      if [ -z "$a" ]; then printf "\n"; else printf " => %s\n" "$a"; fi
   ' sh {} \;
}

Exemplos de uso:

ll   # but see notes below
ll 8C8C190C-5340-421C-96D1-D4111C5E062C
ll /bin
ll foo.txt bar.txt

Exemplo de saída:

-rw------- 1 root root 11789 Sep 12 23:16 8C8C190C-5340-421C-96D1-D4111C5E062C => hello.c

Notas:

  • usei => , não -> , porque o último já é usado por ls para links simbólicos.
  • POSIX requer pelo menos um caminho em find invocação. O único ll (sem argumentos) pode fazer com que find falhe (compare esta resposta ). Em caso afirmativo, você precisará de alguma lógica preliminar para passar . para find .
  • -maxdepth também não é POSIX. Caso você não possa usá-lo, consulte esta pergunta .
  • A função simplesmente passa todos os seus argumentos para find (como "$@" ). Isso significa que esse ll personalizado não entende as opções normalmente usadas por ls (ou alias ll comuns). Por outro lado, é possível injetar testes em find .
  • Caracteres especiais ou não imprimíveis em nomes ou tags podem causar resultados inesperados.
  • ls -dalF é chamado para cada objeto separadamente, portanto as linhas resultantes podem não se alinhar em colunas regulares. Considere -printf action em vez de ls para imprimir todas as informações necessárias, exceto a tag que ainda exigirá getfattr . Usar a tabulação como um separador no formato -printf colocará em colunas uma saída de várias linhas (pelo menos para algum tipo). Observe que, com o formato -printf adequado, você não precisará de tr .
por 28.06.2018 / 10:07