AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 738530
Accepted
Black
Black
Asked: 2023-03-03 21:04:22 +0800 CST2023-03-03 21:04:22 +0800 CST 2023-03-03 21:04:22 +0800 CST

Obtenha uma lista de todos os arquivos e diretórios com suas permissões e proprietários

  • 772

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.

files
  • 5 5 respostas
  • 40 Views

5 respostas

  • Voted
  1. AdminBee
    2023-03-03T21:15:39+08:002023-03-03T21:15:39+08:00

    Para ser independente do formato de saída às vezes alterado dinamicamente ls, eu recomendaria usar statcom a --printfopçã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):

    stat --printf="%A|%U|%G|%n\n" /path/to/dir/* > list_of_tiles.psv
    

    Isso produziria a lista de arquivos e propriedades no formulário

    -rw-rw-r--|black|www-data|foo.txt
    drw-rw-r--|black|www-data|bar/
    

    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 globstaropção para permitir padrões curinga de ação recursiva:

      shopt -s globstar
      stat --printf="%A|%U|%G|%n\n" /path/to/dir/** > list_of_tiles.psv
      

      com saída

      drwxr-xr-x|mygroup|myuser|subdir1
      -rw-r--r--|mygroup|myuser|subdir1/subfile1.txt
      -rw-r--r--|mygroup|myuser|subdir1/subfile2.txt
      drwxr-xr-x|mygroup|myuser|subdir2
      -rw-r--r--|mygroup|myuser|subdir2/subfile3.txt
      -rw-r--r--|mygroup|myuser|that_file.txt
      -rw-r--r--|mygroup|myuser|this_file.txt
      
    • Caso contrário, você pode precisar recorrer ao GNU find:

      find . -printf '%M|%g|%u|%p\n'
      

      com saída

      drwxr-xr-x|mygroup|myuser|.
      drwxr-xr-x|mygroup|myuser|./subdir1
      -rw-r--r--|mygroup|myuser|./subdir1/subfile1.txt
      -rw-r--r--|mygroup|myuser|./subdir1/subfile2.txt
      drwxr-xr-x|mygroup|myuser|./subdir2
      -rw-r--r--|mygroup|myuser|./subdir2/subfile3.txt
      -rw-r--r--|mygroup|myuser|./that_file.txt
      -rw-r--r--|mygroup|myuser|./this_file.txt
      
    • Se nenhum estiver disponível, esta é uma combinação de ambos:

      find . -exec stat --printf="%A|%U|%G|%n\n" {} \;
      

    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 de ls 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.

    • 1
  2. Kusalananda
    2023-03-03T21:16:40+08:002023-03-03T21:16:40+08:00

    Para obter essas informações para um único arquivo ou diretório no Linux, você pode usar o statutilitário com um formato de saída personalizado:

    $ stat -c '%A %U %G %n' ~/.bashrc
    -rw-r--r-- myself myself /home/myself/.bashrc
    

    Se você deseja uma saída delimitada por tabulações, use $'%A\t%U\t%G\t%n'como argumento para a -copçã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:

    find . -exec stat -c $'%A\t%U\t%G\t%n' {} +
    

    Em sistemas BSD (qualquer um dos gratuitos e macOS), você desejará usar stat -f '%Sp %Su %Sg %N'(cada um Sindica uma saída "simbólica" em vez de numérica). Lá, você também pode usar %tpara inserir abas:

    find . -exec stat -f '%Sp%t%Su%t%Sg%t%N' {} +
    

    Exemplo executado no macOS:

    $ tree
    .
    ├── dir1
    │   └── file
    └── dir2
        └── othername
    
    3 directories, 2 files
    
    $ find . -exec stat -f '%Sp%t%Su%t%Sg%t%N' {} +
    drwxr-xr-x  myself  staff   .
    drwxr-xr-x  myself  staff   ./dir2
    -rw-r--r--  myself  staff   ./dir2/othername
    drwxr-xr-x  myself  staff   ./dir1
    -rw-r--r--  myself  staff   ./dir1/file
    
    • 1
  3. Best Answer
    Stephen Kitt
    2023-03-03T22:25:10+08:002023-03-03T22:25:10+08:00

    Se você tiver GNU find, poderá usar sua printfação:

    find . -printf "%M %u %g %p\n"
    

    Isso listará todos os arquivos no diretório atual e quaisquer subdiretórios, com seu tipo e permissões em lsestilo, 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

    find . -printf "%M %-20u %-20g %p\n"
    

    Você pode produzir guias com extensão \t.

    • 1
  4. Tux Over9000
    2023-03-03T21:09:14+08:002023-03-03T21:09:14+08:00

    Acho que você precisa redirecionar os resultados para um arquivo de log. Tente usar isso:

    ls -la /route/of/dir >> /route/ofyouneed/the/log/log.txt
    
    • 0
  5. Stéphane Chazelas
    2023-03-03T23:28:58+08:002023-03-03T23:28:58+08:00

    O zshshell possui operadores de comparação de array e um statbuilt-in para recuperar metadados de arquivo (desde 1996, portanto, é anterior a GNU e BSD, statque são do início dos anos 2000).

    Lá você pode fazer:

    zmodload zsh/stat
    details=()
    for f ($dir/**/*(DN)) stat -LsH s -- $f && details+="$s[mode] $s[uid] $s[gid] $f:t"
    

    Depois de obter esses resultados para dois diretórios separados em duas matrizes (como $details1e $details2, você pode fazer:

    print -rC1 'Only in first:' ${details1:|details2}
    print -rC1 'Only in second:' ${details2:|details1}
    print -rC1 'In both:' ${details1:*details2}
    
    • 0

relate perguntas

  • Remova arquivos com os menores sufixos de nome de arquivo

  • Listar arquivos classificados de acordo com a linha de conteúdo específica

  • Como saber antecipadamente se um .zip tem um diretório pai dentro

  • Como encontrar tipos de arquivos específicos e tar-los?

  • du/df e ls relatando diferentes usos de disco

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve