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 porls
para links simbólicos. - POSIX requer pelo menos um caminho em
find
invocação. O únicoll
(sem argumentos) pode fazer com quefind
falhe (compare esta resposta ). Em caso afirmativo, você precisará de alguma lógica preliminar para passar.
parafind
. -
-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 essell
personalizado não entende as opções normalmente usadas porls
(ou aliasll
comuns). Por outro lado, é possível injetar testes emfind
. - 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 dels
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á detr
.