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 / 791278
Accepted
sdbbs
sdbbs
Asked: 2025-02-19 19:10:39 +0800 CST2025-02-19 19:10:39 +0800 CST 2025-02-19 19:10:39 +0800 CST

Encontrar itens por nome e imprimir se forem arquivos de diretórios?

  • 772

Considere o seguinte exemplo:

mkdir /tmp/test2 && cd /tmp/test2
mkdir -p aa/{tmp,src}
mkdir -p bb/aa/{tmp,src}
mkdir -p {dd,ee}/bb
touch {dd,ee}/bb/aa

tree | awk '{print "# " $0}'
# .
# ├── aa
# │   ├── src
# │   └── tmp
# ├── bb
# │   └── aa
# │       ├── src
# │       └── tmp
# ├── cc
# │   └── aa
# │       ├── src
# │       └── tmp
# ├── dd
# │   └── bb
# │       └── aa
# └── ee
#     └── bb
#         └── aa
#
# 16 directories, 2 files

Então, quero encontrar todos os itens chamados aa, e imprimi-los no mesmo formato que ls -la, para poder ver se são arquivos ou diretórios.

Se eu fizer o típico findwith execof ls -a- então os diretórios em si não serão impressos como itens, mas sim seus conteúdos:

$ find . -name aa -exec ls -la {} \;
total 0
drwxr-xr-x 1 user None 0 Feb 19 11:59 .
drwxr-xr-x 1 user None 0 Feb 19 12:00 ..
drwxr-xr-x 1 user None 0 Feb 19 11:59 src
drwxr-xr-x 1 user None 0 Feb 19 11:59 tmp
total 0
drwxr-xr-x 1 user None 0 Feb 19 11:59 .
drwxr-xr-x 1 user None 0 Feb 19 11:59 ..
drwxr-xr-x 1 user None 0 Feb 19 11:59 src
drwxr-xr-x 1 user None 0 Feb 19 11:59 tmp
total 0
drwxr-xr-x 1 user None 0 Feb 19 11:59 .
drwxr-xr-x 1 user None 0 Feb 19 11:59 ..
drwxr-xr-x 1 user None 0 Feb 19 11:59 src
drwxr-xr-x 1 user None 0 Feb 19 11:59 tmp
-rw-r--r-- 1 user None 0 Feb 19 12:00 ./dd/bb/aa
-rw-r--r-- 1 user None 0 Feb 19 12:00 ./ee/bb/aa

Se eu usar ls -lad {}/isso, imprimo explicitamente apenas os nós do diretório, então os nós do arquivo não são impressos, mas recebo um erro "Não é um diretório":

$ find . -name aa -exec ls -lad {}/ \;
drwxr-xr-x 1 user None 0 Feb 19 11:59 ./aa/
drwxr-xr-x 1 user None 0 Feb 19 11:59 ./bb/aa/
drwxr-xr-x 1 user None 0 Feb 19 11:59 ./cc/aa/
ls: cannot access './dd/bb/aa/': Not a directory
ls: cannot access './ee/bb/aa/': Not a directory

Se eu tentar algum tipo de bashcondicional diretamente na linha de comando, ele falha:

# test
$ [ -d aa ] && echo dir || echo file
dir

$ find . -name aa -exec [ -d {} ] && ls -lad {}/ || ls -la {} \;
find: missing argument to `-exec'
ls: cannot access '{}': No such file or directory
ls: cannot access ';': No such file or directory

Então, como posso usar find . -name aa, para que eu obtenha esta saída:

drwxr-xr-x 1 user None 0 Feb 19 11:59 ./aa/
drwxr-xr-x 1 user None 0 Feb 19 11:59 ./bb/aa/
drwxr-xr-x 1 user None 0 Feb 19 11:59 ./cc/aa/
-rw-r--r-- 1 user None 0 Feb 19 12:00 ./dd/bb/aa
-rw-r--r-- 1 user None 0 Feb 19 12:00 ./ee/bb/aa
files
  • 2 2 respostas
  • 168 Views

2 respostas

  • Voted
  1. Best Answer
    pLumo
    2025-02-19T19:15:39+08:002025-02-19T19:15:39+08:00

    Você quase chegou lá com isso:

    find . -name aa -exec ls -lad {}/ \;
    

    Você precisa da -dopção, mas deixe de fora o final /.
    Você também pode deixar de fora a -aopção, que não é necessária.

    Então isso funciona bem:

    find . -name aa -exec ls -ld {} \;
    

    No entanto, com \;, lsé chamado para cada item. Você deve usar +, em vez disso, , então lsé chamado com a quantidade máxima permitida de argumentos:

    find . -name aa -exec ls -ld {} +
    

    Adicione -ppara obter o final /na sua saída (obrigado @Stéphane Chazelas), mas isso não é necessário, pois você pode separar os arquivos dos diretórios do início dnas informações de permissões.

    Além disso, você pode usar -lsa opção de find, mas isso dará uma saída ligeiramente diferente. Note que esta é uma opção comum, mas não padrão para find.

    find . -name aa -ls
    
    • 6
  2. Marcus Müller
    2025-02-19T20:40:59+08:002025-02-19T20:40:59+08:00

    Gostei da resposta do pLumo .

    Apenas uma observação que talvez você nem precise fazer findpara isso.

    em Bash:

    # globally enable:
    #         /——————————————  looking in places starting with . 
    #         |      /———————  recursive looking
    #         |      |  
    shopt -s dotglob globstar
    ls -ld -- **/aa
    

    em zsh:

    ls -ld -- **/aa(D)
    #               |
    # (D): enable globbing in .-starting directories, only for this
    # glob expression
    

    E, claro, em vez de usar lspara descobrir quais são diretórios, você pode simplesmente filtrar por eles. Usando find, isso seria find -name aa -type d listar apenas diretórios e find -name aa -type flistar apenas arquivos.

    Usando zsh:

    # to list only regular files
    print -rC1 -- **/aa(ND.)
    # to list only directories
    print -rC1 -- **/aa(ND/)
    

    (usar o printbuiltin para imprimir raw na 1 Ccoluna como lsnão é necessário; observe também o Nullglob para evitar um erro e não imprimir nada se não houver correspondência).

    No bash, um pouco mais envolvido:

    shopt -s dotglob globstar nullglob
    shopt -u failglob
    for entry in **/aa ; do
      [[ -f "${entry}" && ! -L "${entry}" ]] &&
        printf '%s is a regular file\n' "${entry}"
      # -d for directory, ! -d for anything *but* directory
    done
    

    Observe que && ! -L "${entry}"excluir links simbólicos como -f filetambém retorna true para links simbólicos eventualmente resolvendo para arquivos regulares. Isso é para imitar o comportamento do qualificador glob findde ou -type fde zsh. .Se você quiser incluí-los, deixe-o de fora e substitua .por -.nos zshqualificadores de ou -typepor com -xtypeo próprio GNU find. ls -lrelata o tipo antes da resolução do link simbólico, a menos que você adicione a opção -Lou -H.

    • 3

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