AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 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

将 xargs 与 pdftk 一起使用

  • 772

我正在使用以下代码连接当前目录中的所有 pdf 文件:

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

xargs 的第一次调用具有将 sort 的输出转换为单行的效果,项目由空格分隔。但结果是这样的:

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.

xargs 是否将参数传递给带有周围引号的 pdftk?如何防止这种情况?(空格、转义以及它们与命令交互的方式总是让我抓狂……)

imagemagick xargs
  • 1 1 个回答
  • 695 Views

1 个回答

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

    xargs 是否将参数传递给带有周围引号的 pdftk?

    是也不是,但从技术上讲不是。xargs 不引用,pdftk 也不取消引用。

    程序在 Linux/Unix 中接收命令行参数的方式不是使用需要被引用和取消引用的单个字符串——这正是面向用户的“命令 shell”语言的工作方式,引号由你的 shell 解释,不是通过程序本身。(这与 Windows 的做法相反。)

    在内部程序是使用字符串数组(/list/vector) 启动的,它固有地保留了每个元素的确切文本内容和分隔,因此它实际上并没有首先使用引号或转义。(也就是说 - 除非你必须嵌套它,在这种情况下它会回到字符串引用和解析,正如你将在下面看到的......)

    例如,您的命令行被解析成这样(例如使用类似 C 的数组语法,但引号实际上不是字符串的一部分):

    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─┘
    

    因此,当 xargs 读取一行输入时(因为 -I 将其设置为逐行模式),它会用输入行替换{} 每个单独元素中的符号,而不会以任何方式重新排列元素。然后它要求操作系统运行结果:

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

    所以你需要一种不同于xargs -I单独的方式来实现这一目标。

    • 例如,您可以要求xargs 运行一个 shell——然后它将以您期望从 shell 中获得的相同方式解释/拆分/取消引用输入:

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

      -c 之后的元素将变为pdftk ./001.pdf ./002.pdf … cat output union.pdfbash 将按预期将其拆分为单词。(但请注意,因为 xargs 不使用引号,这将拆分恰好包含空格的文件名,并且当文件名包含特殊字符时会产生奇怪的结果。)

    • 您可以使用 shell 的“进程替换”功能:

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

      这将在任何空白处拆分结果文本(就像$var变量扩展一样)。不需要先连接这些线。但是对于包含空格的文件名会有同样的问题,而对于特殊字符的问题会稍微少一些。

    • 推荐:你可以完全避免 'find' 和 'xargs' 并直接使用交互式 shell 的内置通配符匹配:

      pdftk *.pdf cat output union.pdf
      

      普通 * 不是递归的,但在 Bash 或 zsh 中你也有 ** 这是递归模式:

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

      (匹配结果将始终排序,至少在使用 POSIX sh 语言的 shell 中是这样。并且因为 shell 直接将每个文件名扩展为单独的命令行元素,所以根本不会出现引用问题,即使是不常用的文件名也是如此。)

    • 9

相关问题

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    Windows 10 服务称为 AarSvc_70f961。它是什么,我该如何禁用它?

    • 2 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Marko Smith

    ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:无法获取本地颁发者证书 (_ssl.c:1056)

    • 4 个回答
  • Marko Smith

    我如何知道 Windows 安装在哪个驱动器上?

    • 6 个回答
  • Martin Hope
    Albin 支持结束后如何激活 WindowsXP? 2019-11-18 03:50:17 +0800 CST
  • Martin Hope
    fixer1234 “HTTPS Everywhere”仍然相关吗? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    Kagaratsch Windows 10 删除大量小文件的速度非常慢。有什么办法可以加快速度吗? 2019-09-23 06:05:43 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    Inter Sys Ctrl+C 和 Ctrl+V 是如何工作的? 2019-05-15 02:51:21 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

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

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve