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 / computer / Perguntas / 1424180
Accepted
Mizar
Mizar
Asked: 2019-04-12 02:38:56 +0800 CST2019-04-12 02:38:56 +0800 CST 2019-04-12 02:38:56 +0800 CST

Usando xargs com pdftk

  • 772

Estou usando o seguinte código para concatenar todos os arquivos pdf no diretório atual:

find . -iname '*.pdf'|sort|xargs|xargs -I {} pdftk {} cat output union.pdf

A primeira invocação de xargs tem o efeito de converter a saída de sort em uma única linha, com itens separados por um espaço. Mas o resultado é este:

Error: Unable to find file.
Error: Failed to open PDF file: 
   ./001.pdf ./002.pdf ./003.pdf ./004.pdf ./007.pdf ./010.pdf ./031.pdf ./057.pdf ./077.pdf ./103.pdf ./131.pdf ./155.pdf ./179.pdf ./205.pdf ./233.pdf ./261.pdf ./285.pdf ./313.pdf ./331.pdf ./357.pdf ./383.pdf ./411.pdf
Errors encountered.  No output created.
Done.  Input errors, so no output created.

O xargs passa o argumento para pdftk com aspas ao redor? Como evitar isso? (Espaços em branco, escape e a forma como eles interagem com os comandos sempre me deixam louco...)

imagemagick xargs
  • 1 1 respostas
  • 695 Views

1 respostas

  • Voted
  1. Best Answer
    user1686
    2019-04-12T03:18:13+08:002019-04-12T03:18:13+08:00

    O xargs passa o argumento para pdftk com aspas ao redor?

    Sim e não, mas tecnicamente não. xargs não faz citações e pdftk também não tira aspas.

    A maneira como os programas recebem argumentos de linha de comando no Linux/Unix não é usando uma única string que precisa ser citada e não citada – é assim que funciona a linguagem de "shell de comando" voltada para o usuário, e as aspas são interpretadas pelo seu shell, não pelos próprios programas. (Isso é o oposto de como o Windows faz isso.)

    Internamente, os programas são iniciados usando uma matriz (/lista/vetor) de strings, que preserva inerentemente o conteúdo exato do texto e a separação de cada elemento, portanto, realmente não usa aspas ou escape em primeiro lugar. (Isto é - a menos que você tenha que aninhá-lo, caso em que está de volta à citação e análise de strings, como você verá abaixo ...)

    Por exemplo, sua linha de comando é analisada para isso (usando sintaxe de array semelhante a C, por exemplo, mas as aspas não fazem parte das strings):

    1. {"find", ".", "-iname", "*.pdf", NULL}
    2. {"sort", NULL}
    3. {"xargs", NULL}
    4. {"xargs", "-I", "{}", "pdftk", "{}", "cat", "output", "union.pdf", NULL}
                             └─xargs uses these elements as the command─┘
    

    Portanto, quando xargs lê uma linha de entrada (porque -I define o modo linha por linha), ele substitui os símbolos {} em cada elemento individual pela linha de entrada, sem reorganizar os elementos de forma alguma. Em seguida, ele pede ao sistema operacional para executar o resultado:

    {"pdftk", "./001.pdf ./002.pdf ./003.pdf …", "cat", "output", "union.pdf", NULL}
    

    Portanto, você precisará de uma maneira diferente de conseguir isso xargs -Isozinho.

    • Você poderia, por exemplo, pedir ao xargs para executar um shell - que irá então interpretar/dividir/retirar aspas da entrada da mesma forma que você esperaria de um shell:

      find … | sort | xargs | xargs -I {} bash -c "pdftk {} cat output union.pdf"
      

      O elemento seguinte -c se tornará pdftk ./001.pdf ./002.pdf … cat output union.pdfe o bash o dividirá em palavras conforme o esperado. (Mas observe que, como xargs não faz aspas, isso dividirá os nomes de arquivos que contêm espaços e fornecerá resultados estranhos quando os nomes de arquivos contiverem caracteres especiais.)

    • Você pode usar o recurso de "substituição de processo" do shell:

      pdftk $(find … | sort) cat output union.pdf
      

      Isso dividirá o texto resultante em qualquer espaço em branco (assim como $vara expansão variável). As linhas não precisam ser unidas primeiro. Mas terá os mesmos problemas com nomes de arquivos contendo espaços e um pouco menos com caracteres especiais.

    • Recomendado: você pode evitar 'find' e 'xargs' totalmente e usar a correspondência de curinga integrada do shell interativo diretamente:

      pdftk *.pdf cat output union.pdf
      

      Comum * não é recursivo, mas no Bash ou zsh você também tem ** que é o modo recursivo:

      shopt -s globstar                       # enable the feature (only needed in bash)
      
      pdftk **/*.pdf cat output union.pdf
      

      (Os resultados da correspondência sempre serão classificados, pelo menos em shells usando a linguagem POSIX sh. E como o shell expande diretamente cada nome de arquivo para um elemento de linha de comando individual, não haverá nenhum problema de citação, mesmo com nomes de arquivo incomuns.)

    • 9

relate perguntas

Sidebar

Stats

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

    O visualizador de fotos do Windows não pode ser executado porque não há memória suficiente?

    • 5 respostas
  • Marko Smith

    Como faço para ativar o WindowsXP agora que o suporte acabou?

    • 6 respostas
  • Marko Smith

    Área de trabalho remota congelando intermitentemente

    • 7 respostas
  • Marko Smith

    Serviço do Windows 10 chamado AarSvc_70f961. O que é e como posso desativá-lo?

    • 2 respostas
  • Marko Smith

    O que significa ter uma máscara de sub-rede /32?

    • 6 respostas
  • Marko Smith

    Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows?

    • 1 respostas
  • Marko Smith

    O VirtualBox falha ao iniciar com VERR_NEM_VM_CREATE_FAILED

    • 8 respostas
  • Marko Smith

    Os aplicativos não aparecem nas configurações de privacidade da câmera e do microfone no MacBook

    • 5 respostas
  • Marko Smith

    ssl.SSLCertVerificationError: falha na verificação do certificado [SSL: CERTIFICATE_VERIFY_FAILED]: não foi possível obter o certificado do emissor local (_ssl.c:1056)

    • 4 respostas
  • Marko Smith

    Como posso saber em qual unidade o Windows está instalado?

    • 6 respostas
  • Martin Hope
    Albin Como faço para ativar o WindowsXP agora que o suporte acabou? 2019-11-18 03:50:17 +0800 CST
  • Martin Hope
    fixer1234 O "HTTPS Everywhere" ainda é relevante? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    Kagaratsch O Windows 10 exclui muitos arquivos minúsculos muito lentamente. Algo pode ser feito para agilizar? 2019-09-23 06:05:43 +0800 CST
  • Martin Hope
    andre_ss6 Área de trabalho remota congelando intermitentemente 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney Por que colocar um ponto após o URL remove as informações de login? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    Inter Sys Como Ctrl+C e Ctrl+V funcionam? 2019-05-15 02:51:21 +0800 CST
  • Martin Hope
    jonsca Todos os meus complementos do Firefox foram desativados repentinamente, como posso reativá-los? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK É possível criar um código QR usando texto? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 Altere o nome da ramificação padrão do git init 2019-04-01 06:16:56 +0800 CST

Hot tag

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

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