Имена файлов с пробелами в середине команды (не цикл while / for) - PullRequest
0 голосов
/ 23 сентября 2019

Я пытаюсь предоставить список имен файлов с пробелами для pdftk (чтобы объединить 3 PDF-файла в один PDF-файл), но мне, похоже, не нравится то, что я пытаюсь.

# pdftk INPUT1.pdf INPUT2.pdf output OUTPUTFILE.pdf

Этоработает с указанием файлов вручную:

$ pdftk "pdf 1.pdf" "pdf 2.pdf" output t.pdf
$ ls t.pdf
t.pdf (and it works/opens fine)

Но, похоже, ничего из следующего не работает:

$ pdftk "$(ls --quoting-style=c | tr "\n" " ")" output t.pdf
Error: Unable to find file.
Error: Failed to open PDF file: 
   "pdf 1.pdf" "pdf 2.pdf" "pdf 3.pdf" 
Errors encountered.  No output created.
Done.  Input errors, so no output created.

(примечание выше, использование кавычек вокруг $ (ls) тоже не работает)

или это:

$ ls -1
'pdf 1.pdf'
'pdf 2.pdf'
'pdf 3.pdf'

$ pdftk "$(ls -1 | tr "\n" " ")" output t.pdf
Error: Unable to find file.
Error: Failed to open PDF file: 
   pdf 1.pdf pdf 2.pdf pdf 3.pdf 
Errors encountered.  No output created.
Done.  Input errors, so no output created.

Ответы [ 2 ]

2 голосов
/ 23 сентября 2019
$ pdftk "$(some command)" output t.pdf

При этом запускается какая-то команда, затем двойные кавычки инкапсулируют вывод в одно «слово».Независимо от того, какая команда, результатом будет то, что pdftk получит единственный аргумент, содержащий полные выходные данные команды.

Синтаксический анализ ls обычно считается плохой идеей.

Как предлагает @ RavinderSingh13, простое указание *.pdf (или даже *) может решить вашу проблему.Оболочка выполняет «глобализацию» для расширения подстановочных знаков и правильно разбивает их на «слова»:

$ pdftk * output t.pdf

Если вы выполняете какую-либо команду, отличную от ls, которая выводит списокимена файлов, вам нужно быть немного осторожным, чтобы вы указали в правильной точке.

Некоторые переносимые способы сделать это (с некоторыми предположениями о выводе команды) приведены в разделе «Использование приложения» Спецификация POSIX для xargs .

В системах с версиями утилит GNU (например, find и xargs) предусмотрен более надежный механизм с использованием нестандартных -print0, -0и связанные параметры команды, которые предполагают, что символ NULL является (единственным) специальным символом, используемым для разделения элементов вывода команды.

1 голос
/ 23 сентября 2019

Учитывая, что вы хотите объединить только 3 файла за раз, вы можете попробовать следующее, я проверил это в системе Ubuntu для 3 файлов (где он обрабатывает имена файлов с пробелом тоже).Вы можете проверить это один раз.

pdftk *.pdf output t.pdf
...