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 / 480019
Accepted
AbstProcDo
AbstProcDo
Asked: 2018-11-06 17:34:39 +0800 CST2018-11-06 17:34:39 +0800 CST 2018-11-06 17:34:39 +0800 CST

Distinguir um comando não um segundo transmissor nativo

  • 772

suponha

[root@iz2ze9wve43n2nyuvmsfx5z /]# find . -maxdepth 2 -type d  | ls
bin   dev  home  lib64       media  opt   root  sbin  sys  usr
boot  etc  lib   lost+found  mnt    proc  run   srv   tmp  var

ls não fez nada, como resgate, devo reconstruí-los em uma lista para ls

find . -type d | xargs ls
#millions of outputs

No entanto, o grep faz um bom trabalho

[root@iz2ze9wve43n2nyuvmsfx5z /]# find . -maxdepth 2 -type d  | grep home
./home

Como eu poderia distinguir um comando não nasceu como um segundo transmissor da compreensão subjacente em vez de tentar, testar o erro e lembrar.

grep find
  • 1 1 respostas
  • 31 Views

1 respostas

  • Voted
  1. Best Answer
    Jeff Schaller
    2018-11-06T18:45:33+08:002018-11-06T18:45:33+08:00

    Ou você aprende e lembra o que os vários programas fazem ou verifica as páginas do manual.

    A descrição de lsé:

    Listar informações sobre os FILEs (o diretório atual por padrão)

    onde FILEs se refere à sinopse:

    ls [OPÇÃO]... [ARQUIVO]...

    A parte importante a ser lembrada lsé que ele gerará informações sobre os "FILEs" que você fornecer - na linha de comando . O manual não descreve nenhuma maneira de lsler qualquer entrada (por exemplo, um pipe).

    Compare a lspágina do manual com, digamos, a catpágina do manual, que diz:

    gato [OPÇÃO]... [ARQUIVO]...

    Concatenar FILE(s) à saída padrão. Sem FILE, ou quando FILE for -, leia a entrada padrão.

    Com cat, você pode cat /some/fileou você pode echo hi | cat.

    Portanto, em seu primeiro exemplo,

    find . -maxdepth 2 -type d  | ls
    

    findfoi e fez algum trabalho e passou alguns (ou nenhum) nomes de diretório em seu stdout, que se tornou ls'stdin, que lsprontamente ignorou. Como você lsnão forneceu FILEs para listar, o padrão foi listar o diretório atual.

    No seu segundo exemplo,

    find . -type d | xargs ls
    

    findfoi e fez (mais) trabalho, produzindo todos os diretórios encontrados em seu stdout, que por sua vez foi apresentado xargscomo stdin. A página man para xargsleituras, em parte:

    xargs lê itens da entrada padrão... e executa o comando uma ou mais vezes...

    so then lsé chamado quantas vezes forem necessárias, dado o número de linhas de entrada em stdin.

    A mesma ideia se traduz em seu terceiro comando:

    find . -maxdepth 2 -type d  | grep home
    

    findpassa qualquer nome de diretório para grepo stdin de ; A página de manual do grep diz, novamente em parte:

    O grep procura nos arquivos de entrada nomeados por linhas que contenham uma correspondência para o PATTERN fornecido. Se nenhum arquivo for especificado, ou se o arquivo “-” for fornecido, o grep pesquisa a entrada padrão.

    A ideia de um pipeline é simples, mas poderosa, e você simplesmente precisa saber que tipo de saída um programa produz e se um programa pode consumir entrada em seu stdin.

    grepé uma das ferramentas mais comuns para usar nessas situações. Você pode usá-lo como o comando principal:

    grep some-text file1 file2 file3 ...
    

    nesse caso grepsabe os nomes dos arquivos, ou você pode enviar a entrada em seu stdin:

    cat file1 file2 file3 ... | grep some-text
    

    ... nesse caso, o grep não conhece mais nenhum nome de arquivo ( catos conhecia, depois produziu seu conteúdo para stdout), e agora o grep não pode saber quais arquivos continham o texto - apenas quais linhas correspondiam.

    É tentador encadear um monte de comandos juntos - muitas vezes chamado de "one-liner" muitas vezes semi-facetado, já que um "one-liner" pode se tornar longo o suficiente para envolver duas linhas por segunda em uma janela de terminal - em um "tubulação". Aqui, novamente, você precisa saber exatamente como os programas estão produzindo e consumindo entrada.

    Dados os arquivos chamados file1, file2e file3, você pode fazer algo como:

    find . -name 'file*' | xargs cat
    

    e você não ficará surpreso quando findproduzir os três nomes de arquivos como stdout --

    file1 
    file2 
    file3
    

    ... para o qual xargs compila uma lista e envia para cat--

    cat file1 file2 file3
    

    ... que vê esses três nomes de arquivo e obedientemente despeja seu conteúdo na sua tela.

    Cuidado, então, com um arquivo chamado "nome do arquivo aqui"; o comando acima findirá produzir:

    file name here
    file1
    file2
    file3
    

    ... para o qual o xags compila uma lista para cat--

    cat file name here file1 file2 file3
    

    ... ao qual catreclama (para stderr!):

    cat: file: Arquivo ou diretório inexistente

    cat: name: Arquivo ou diretório inexistente

    cat: aqui: nenhum arquivo ou diretório

    ... seguido pelo conteúdo de arquivo1, arquivo2 e arquivo3.

    Agora você está preparado para evitar essa situação usando find ... -execou alternativas como find ... -print0 | xargs -0 ...usar NULLs como delimitadores para nomes de arquivos.

    • 4

relate perguntas

  • Localizar e substituir cores em arquivos CSS na linha de comando

  • Comando ls | grep mostrando apenas diretórios (quando também deveria mostrar arquivos)

  • quando o grep conta e quando não

  • grep --line-buffered até X linhas?

  • GNU find: obtenha caminho absoluto e relativo em -exec

Sidebar

Stats

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

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

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 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

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 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
    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
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +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
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +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