使用 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。
根据这个答案,我能够使用这个 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。