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 -s
mas 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 ls
com 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 ls
tornaria 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 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 essas coisas de maneira mais conveniente. Agora digamos que você escolha ll
fazer 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 porls
links simbólicos. - POSIX requer pelo menos um caminho na
find
invocação. Solell
(sem argumentos) pode causarfind
falha (compareesta resposta). Nesse caso, você precisará de alguma lógica preliminar para.
passarfind
. -maxdepth
també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 costumell
não entende as opções normalmente usadas porls
(oull
alias 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-printf
uma ação em vez dels
imprimir todas as informações necessárias, exceto a tag que ainda exigirágetfattr
. Usar tab como separador no-printf
formato colocará em coluna uma saída multilinha (pelo menos até certo ponto). Observe que com-printf
o formato adequado você não precisará de arquivostr
.