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 porlspara links simbólicos. - POSIX requer pelo menos um caminho em
findinvocação. O únicoll(sem argumentos) pode fazer com quefindfalhe (compare esta resposta ). Em caso afirmativo, você precisará de alguma lógica preliminar para passar.parafind. -
-maxdepthtambé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 essellpersonalizado não entende as opções normalmente usadas porls(ou aliasllcomuns). 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-printfaction em vez delspara imprimir todas as informações necessárias, exceto a tag que ainda exigirágetfattr. Usar a tabulação como um separador no formato-printfcolocará em colunas uma saída de várias linhas (pelo menos para algum tipo). Observe que, com o formato-printfadequado, você não precisará detr.