使用 Zsh 和 QPDF 解密多个 PDF

Using Zsh and QPDF to decrypt multiple PDFs

根据这个答案,我能够使用这个 bash 脚本就地解密多个 PDF:

temp=`ls`; 
for each in $temp;
do qpdf --decrypt --replace-input $each;  
done

然而,我最初尝试在 Zsh 中执行此操作(因为它在 MacOS 10.15 Catalina 中受到鼓励),但无法做到。它给出了 output: File name too long

的错误

Bash 和 Zsh 中的 for 循环有什么区别?我该如何编写合适的 Zsh 脚本?

for循环没有区别,但变量展开的方式不同。考虑这个程序:

x='a b'
for v in $x
do
  echo $v
done

在 bash 中,$x 将分词为 2 个参数,因此循环将执行两次,一次用于 a,一次用于 b。在 zsh 中,$x 不会进行分词并且循环将执行一次,对于 valud a b。当您扩展参数时,这种差异无处不在。

在您的例子中,循环执行一次,each 保存 ls 语句的完整输出。

当然在你的情况下,在 zsh 中将循环写成

会更简单
for each in *(N)

但如果你真的需要一个变量,我会使用数组:

temp=(*(N))

如果没有文件,通配符后的 N 标志会确保您得到一个空字符串而不是错误消息。

如果您还想捕获点文件(类似于 ls -A 所做的),请改用 (ND)

parsing the result of ls is not encouraged 起,可能不建议使用 ls 获取 pdf 文件名。相反,您可以使用 find:

find . -name '*.pdf' -exec qpdf --decrypt --replace-input "{}" \;

您可以通过将 -maxdepth 1 添加到 find 来限制当前目录中的 pdf。