maneira simples de descrever/marcar arquivos no bash

maneira simples de descrever/marcar arquivos no bash

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 assim (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

Tentei fazer algo, ln -smas acabei com muitas duplicatas porque os links estão no mesmo diretório e para obter uma boa visualização devo filtrar ls com grep.. qualquer ajuda será apreciada

Responder1

Não acho que você possa (mal) usar de maneira confiável qualquer recurso disponível para fazer com que o regular ls(com ou sem opções) faça o que deseja. Você precisa redefinir lscom um script, uma função ou um alias.

Eu não me redefiniria ls, pelo menos não neste exemplo, que pretende seruma simples prova de conceito. O suporte a opções de linha de comando lstornaria o exemplo excessivamente complexo.

Para implementar minha solução você precisa de um sistema de arquivos que suporte atributos estendidos e ferramentas para manipulá-los (por exemplo, apt-get install attrno 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 essas coisas de maneira mais conveniente. Agora digamos que você escolha llfazer o que quiser. Se for um alias, você precisa primeiro remover o alias:

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:

  • Eu usei =>, não ->, porque o último já é usado por lslinks simbólicos.
  • POSIX requer pelo menos um caminho na findinvocação. Sole ll(sem argumentos) pode causar findfalha (compareesta resposta). Nesse caso, você precisará de alguma lógica preliminar para .passar find.
  • -maxdepthtambém não é POSIX. Caso você não consiga utilizá-lo, consulteessa questão.
  • A função simplesmente passa todos os seus argumentos para find(as "$@"). Isso significa que esse costume llnão entende as opções normalmente usadas por ls(ou llalias comuns). Por outro lado, findé possível injetar testes.
  • 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 -printfuma ação em vez de lsimprimir todas as informações necessárias, exceto a tag que ainda exigirá getfattr. Usar tab como separador no -printfformato colocará em coluna uma saída multilinha (pelo menos até certo ponto). Observe que com -printfo formato adequado você não precisará de arquivos tr.

informação relacionada