Preciso gerar uma lista de todos os arquivos e diretórios com sua permissão e proprietário, por exemplo
-rw-rw-r-- black www-data foo/
-rw-r--r-- black www-data foo/foo.txt
-rw-rw-r-- black www-data bar/
-rwxrwxr-x black www-data bar/foo.sh
Preciso dessa lista para compará-la com outra instância em que tenho um bug.
Para ser independente do formato de saída às vezes alterado dinamicamente
ls
, eu recomendaria usarstat
com a--printf
opção de ter controle sobre o formato de saídas. O seguinte criaria tal lista em um formato mais "legível por máquina", usando o|
símbolo como separador (a escolha é arbitrária, consulte o último parágrafo para saber mais sobre isso):Isso produziria a lista de arquivos e propriedades no formulário
No entanto, por padrão, isso não listaria os arquivos e diretórios dentro dos subdiretórios. Para conseguir isso, existem várias maneiras:
Se você estiver usando o bash, poderá ativar a
globstar
opção para permitir padrões curinga de ação recursiva:com saída
Caso contrário, você pode precisar recorrer ao GNU
find
:com saída
Se nenhum estiver disponível, esta é uma combinação de ambos:
Observe também que esta abordagem só será realmente bem-sucedida para o seu propósito de comparações (automatizadas?) Se os próprios nomes de arquivo não contiverem o caractere separador
|
ou novas linhas (que infelizmente também são caracteres permitidos). Esta é uma das razões pelas quais é desencorajado analisar a saída dels
oufind
por meio de scripts. O mesmo vale para qualquer escolha do caractere separador; esta resposta usa|
simplesmente porque é encontrada com menos frequência em nomes de arquivos do que, por exemplo, o espaço.Para obter essas informações para um único arquivo ou diretório no Linux, você pode usar o
stat
utilitário com um formato de saída personalizado:Se você deseja uma saída delimitada por tabulações, use
$'%A\t%U\t%G\t%n'
como argumento para a-c
opção (em shells que entendem$'...'
como uma string C).Para obter as informações de tudo no diretório atual e abaixo, recursivamente, use
find
:Em sistemas BSD (qualquer um dos gratuitos e macOS), você desejará usar
stat -f '%Sp %Su %Sg %N'
(cada umS
indica uma saída "simbólica" em vez de numérica). Lá, você também pode usar%t
para inserir abas:Exemplo executado no macOS:
Se você tiver GNU
find
, poderá usar suaprintf
ação:Isso listará todos os arquivos no diretório atual e quaisquer subdiretórios, com seu tipo e permissões em
ls
estilo, proprietário e grupo e nome completo a partir do diretório atual.Se você deseja espaçamento consistente, pode usar especificadores de largura de campo, por exemplo
Você pode produzir guias com extensão
\t
.Acho que você precisa redirecionar os resultados para um arquivo de log. Tente usar isso:
O
zsh
shell possui operadores de comparação de array e umstat
built-in para recuperar metadados de arquivo (desde 1996, portanto, é anterior a GNU e BSD,stat
que são do início dos anos 2000).Lá você pode fazer:
Depois de obter esses resultados para dois diretórios separados em duas matrizes (como
$details1
e$details2
, você pode fazer: