0

从这个答案https://stackoverflow.com/a/59688271/7577919我能够使用这个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 脚本?

4

2 回答 2

2

由于不鼓励解析 ls 的结果,因此可能不建议使用它ls来获取 pdf 文件名。相反,您可以使用find

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

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

于 2020-01-22T08:36:54.203 回答
2

在 for 循环中没有区别,但在变量扩展的方式上。考虑这个程序:

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

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

在您的情况下,循环执行一次,each保存ls语句的完整输出。

当然,在您的情况下,在 zsh 中将循环编写为

for each in *(N)

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

temp=(*(N))

如果没有文件,通配符后的N-flag 会确保您获得空字符串而不是错误消息。

如果您还想捕获点文件(类似于 als -A会做的事情),请(ND)改用。

于 2020-01-22T07:18:26.160 回答