bash :: visualmente distinguindo hard links on ls

1

Estou usando o shell bash no Ubuntu.

Eu sou parcial a links simbólicos em bash mesmo quando um hard link faz mais sentido porque eles podem ser mais facilmente identificados com um ls . Em contraste, para hard links eu tenho que comparar visualmente os números inode . Isso é mais complicado em comparação com a saída de ls em um link flexível que mostra o destino com "- >" e pode ter um esquema de cores diferente aplicado. Existe uma maneira de diferenciar visualmente os hard links de "arquivos normais" de ls ? Por exemplo. talvez por colorir diferentes arquivos com uma contagem de referência de mais de 1?

Eu entendo que a questão não é enquadrada corretamente como conceitualmente um hard link é apenas outro nome para o inode e tão indistinguível de um "arquivo normal" e que não há conceito de um alvo como em links simbólicos mas você obtém meu caso de uso.

    
por MarcusJuniusBrutus 15.08.2012 / 18:44

1 resposta

3

ls -l output mostra o número de links físicos para uma entrada do sistema de arquivos entre permissões e proprietário:

$ mkdir foo
$ ls -ld foo
drwxr-xr-x  2 danielbeck  staff  68 15 Aug 18:49 foo

Por padrão, é 2 para diretórios vazios, foo/. e foo . Cada subdiretório adiciona um para seu .. . A menos que você esteja no OS X e de sanidade questionável, esse é o único link rígido do diretório que você terá.

Os arquivos, é claro, mostram apenas hard links "reais", então qualquer coisa, exceto 1 , indica que há um link físico em algum lugar:

$ touch bar
$ ln bar baz
$ ls -l bar baz
-rw-r--r--  2 danielbeck  staff  0 15 Aug 18:52 bar
-rw-r--r--  2 danielbeck  staff  0 15 Aug 18:52 baz

Meu (BSD / OS X) ls não tem opções relacionadas a hard links, mas você pode escrever sua própria função de shell, como a seguinte, que imprime apenas a contagem de hard link e é ls -F1 (se ls -l é muito complicado):

function lss {
    OLDIFS="$IFS"
    IFS=$'\n'
    for line in $( ls -d1 $@ )
        do stat -f '%N%T (%l)' "$line"
    done
    IFS="$OLDIFS"
}

Saída para os dois hardlinks e um arquivo não relacionado qux :

$ lss bar baz qux
bar (2)
baz (2)
qux (1)
    
por 15.08.2012 / 19:07