2013-10-01 2 views
4

Я совершенно новичок в Bash, так что это может быть что-то тривиальное, но я просто не понимаю. Я пытаюсь избежать пробелов внутри имен файлов. Взгляни. Обратите внимание, что это «рабочий пример» - я получаю, что чередование файлов с пустыми страницами может быть выполнено легче, но я здесь о пространстве.Bash экранирование пробелов в имени файла, в переменной

#! /bin/sh 

first=true 
i=combined.pdf 
o=combined2.pdf 
for f in test/*.pdf 
do 
    if $first; then 
     first=false 
     ifile=\"$f\" 
    else 
     ifile=$i\ \"$f\" 
    fi 
    pdftk $ifile blank.pdf cat output $o 
    t=$i 
    i=$o 
    o=$t 
    break 
done 

Скажем, у меня есть файл с именем my file.pdf (с пробелом). Я хочу, чтобы переменная ifile содержала строку combined.pdf "my file.pdf", так что pdftk может использовать ее в качестве двух аргументов файла: первый из которых - combined.pdf, а второй - my file.pdf.

Я пробовал различные способы ускользания (с или без первого выхода из самих котировок и т. Д.), Но при выполнении pdftk он продолжает разделять my и file.pdf.

EDIT: Чтобы уточнить: я пытаюсь передать несколько имен файлов (как несколько аргументов) в одну переменную команде pdftk. Я хотел бы, чтобы он распознал разницу между двумя именами файлов, но не разрывал одно имя файла в пространстве.

+1

Не для того, чтобы быть раздражающим, но за две секунды поискового запроса, и я нашел это: http://www.lornajane.net/posts/2011/combining-pdf-files-with-pdftk –

+0

Это «минимальный рабочий пример» моя проблема. Перед добавлением файлов я делаю несколько других вещей. – Joost

+0

Ах, потому что вам нужна пустая страница между каждой страницей. Я этого не видел. –

ответ

7

Ввод нескольких аргументов в одну переменную не имеет смысла. Вместо этого поместите их в массив:

args=(combined.pdf "my file.pdf"); 

Обратите внимание, что "my file.pdf" котируется сохранить пробелы.

Вы можете использовать массив как это:

pdftk "${args[@]}" ... 

Это будет проходить два отдельных аргумента в pdftk. Кавычки в "${args[@]}" необходимы, потому что они говорят оболочке рассматривать каждый элемент массива как отдельное «слово» (т. Е. Не разделять элементы массива, даже если они содержат пробелы).

В качестве примечания, если вы используете bash измы как массивы, изменить свой притон для

#!/bin/bash 
+0

Я уверен, что это не сработает, если в файле есть пробелы. Я помню, что когда-то делал что-то подобное. –

+0

Это то, что я должен был начать с самого начала. Это бессмысленно пытаться использовать для этого строку. Благодаря! – Joost

+1

@AdamGent Из раздела manpash 'bash' на массивах:' Если слово имеет двойные кавычки, ... $ {name [@]} расширяет каждый элемент имени до отдельного слова. Другими словами, элементы массива * не * разделены на пробелы. – ThisSuitIsBlackNot

0

Try:

find test/*.pdf | xargs -I % pdftk % cat output all.pdf 

Как я уже сказал в своем комментарии на другие ответы xargs наиболее эффективный способ сделать это.

EDIT: Я не видел, чтобы вам нужна пустая страница, но я полагаю, что вы могли бы направить find выше на некоторую команду, чтобы поместить пустую страницу между ними (аналогично списку-> string join). Я предпочитаю этот способ, как его больше похоже на FP.

+0

Вы не избегаете пробелов. Это должно быть 'find test/*. Pdf -print0 | xargs -0 -J% pdftk% cat output all.pdf' – jaygooby

 Смежные вопросы

  • Нет связанных вопросов^_^