Использование Zsh и QPDF для расшифровки нескольких PDF-файлов - PullRequest
0 голосов
/ 22 января 2020

Из этого ответа { ссылка } Мне удалось расшифровать несколько PDF-файлов на месте с помощью этого сценария bash:

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

Однако я изначально пытался сделать это в Zsh (как рекомендуется в MacOS 10.15 Catalina), но не удалось. Он выдал ошибку output: File name too long

В чем разница между циклами for в Bash и Zsh и как мне go написать правильный скрипт Zsh?

Ответы [ 2 ]

1 голос
/ 22 января 2020

Поскольку синтаксический анализ результата ls не рекомендуется , вероятно, не рекомендуется использовать ls для получения имен файлов pdf. Вместо этого вы можете использовать find:

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

. Вы можете ограничить pdf в текущем каталоге, добавив -depth 1 к find.

.
1 голос
/ 22 января 2020

Нет никакой разницы в for-l oop, но в способе расширения переменных. Рассмотрим эту программу:

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

В bash слово $ x будет разбито на 2 аргумента, и, следовательно, l oop будет выполнено дважды, один раз для a и один раз для b. В zsh, $ x не будет при go разбиении слов, а l oop будет выполнен один раз для значения a b. Это различие везде, когда вы раскрываете параметр.

В вашем случае l oop выполняется один раз, each содержит полный вывод оператора ls.

Of Конечно, в вашем случае было бы проще в zsh записать l oop как

for each in *(N)

, но если вам действительно нужна переменная, я бы использовал массив:

temp=(*(N))

Флаг N после подстановочного знака обеспечивает получение пустой строки вместо сообщения об ошибке, если файлов нет.

Если вы также хотите перехватить точечные файлы (аналогично что бы ls -A делал), используйте (ND).

...