2016-08-08 51 views
0

我找到了一個聲稱可以做一個文件夾的解決方案,但我有一個深層文件夾層次結構的樂譜,我想從png批量轉換爲PDF格式。我的解決方案是什麼樣的?將PNG批量轉換爲單個PDF,同時在bash中保持深層文件夾層次結構

我會遇到進一步的問題,這可能會使事情變得複雜。也許我應該寫一個腳本? (我總共n00b fyi)

「進一步的問題」是我的一些活頁樂譜跨越了多頁,所以如果腳本可以解析包含「1of2」和「2of2」的文件名整合成一個pdf,這將是整潔。

我在這裏有什麼選擇?

非常感謝。

+0

也許從[問]開始。 – SiKing

回答

1

更新回答

作爲替代,下面應該會更快(因爲它在並行轉換),也能夠處理的文件數量較大:

find . -name \*.png -print0 | parallel -0 convert {} {.}.pdf 

它採用GNU並行這是現成的在Linux/Unix的d可使用簡單地安裝在OSX與homebrew

brew install parallel 

原來的答案(如接受)

如果你有bash 4或以上版本,你可以使用extended globbing遞歸目錄和做你的工作很乾脆:

首先使extended globbing有:

shopt -s globstar 

然後遞歸地將PNG轉換爲PDF:

mogrify -format pdf **/*.png 
1

您可以在文件夾層次遍歷png文件,並處理每一個如下:

find /path/to/your/files -name '*.png' | 
while read -r f; do 
    g=$(basename "$f" .png).pdf 
    your_conversion_program <"$f" >"$g" 
done 

要合併pdf -s,你可以使用pdftk。你需要找到所有pdf文件有他們的名字1of22of2,並運行這些pdftk

find /path/to/your/files -name '*1of2*.pdf' | 
while read -r f1; do 
    f2=${f1/1of2/2of2}       # name of second file 
    ([ -f "$f1" ] && [ -f "$f2" ]) || continue # check both exist 
    g=${f1/1of2//}        # name of output file 
    (! [ -f "$g" ]) || continue     # if output exists, skip 
    pdftk "$f1" "$f2" output "$g" 
done 

參見:

1

關於深文件夾層次結構你可以使用find和-exec選項。 首先你會發現在每一個子文件夾中所有的PNG圖像,並將其轉換爲PDF格式:

find ./ -name \*\.png -exec convert {} {}.pdf \; 

你會得到擴展名爲「.png.pdf」新的PDF文件(image.png將被轉換爲image.png。例如pdf) 要更正擴展名,您可以再次運行find命令,但這次使用-exec選項後的「rename」命令。

find ./ -name \*\.png\.pdf -exec rename s/\.png\.pdf/\.pdf/ {} \; 

如果你想刪除源PNG文件,你可以使用這個命令,它會刪除與遞歸在每個子文件夾「.png」後綴的所有文件:

find ./ -name \*\.png -exec rm {} \; 
+0

所以這個語法適用於bash,或者這是我將放入腳本的東西嗎?我是否要在文件夾內執行此操作?另外,我可以將「convert」改爲「mogrify」來替換文件,對吧? –

+0

它適用於bash和內部腳本。 –

+0

您應該在包含您放置PNG的所有子文件夾的文件夾中執行它。該命令遞歸搜索文件夾結構(您可以限制它使用-maxdepth和-mindepth選項僅搜索某些級別的文件夾結構)。 是的,find -exec也會與mogrify一起使用。事實上,它應該與任何命令一起工作。 小解釋: 命令執行過程中{b}被替換爲bash命令的第一部分('find ./ -name \ * \。png')找到的文件的名稱和'\;'必須總是在命令結尾 –

0

如果我的理解:

  • 你想要連接你所有的png文件從深層文件夾結構到只有一個pdf

所以......

  1. 確保你在你的文件夾要
  2. 知道你可以重定向命令的輸出你PNG排序(比如搜索一個;))到輸入的轉換,並告訴轉換成一個PDF格式的輸出。

轉換的一般語法:

convert 1.png 2.png ... global_png.pdf 

以下命令:

convert `find . -name '*'.png -print` global_png.pdf 
  • 搜索文件夾中的PNG文件從cur_dir
  • 重定向命令的輸出find輸入convert,這是由回報價find命令
  • 轉換工作,並輸出到PDF文件進行

(這個非常簡單的命令行工作正常只unspaced文件名,千萬不要錯過報價野生炭,和背面引述find命令;))

[編輯]護理....

確定你在做什麼。使用convert沒有任何棘手的-quality輸出選項可以創建

如果您刪除PNG文件,你只會失去你的原始資料...

  • 這可能是一個非常不好的做法...
  • 一個巨大的PDF文件...你可能必須重新convert-quality "60"例如...
  • 所以保持你的原始來源,直到你不需要他們的任何更多
+0

我不認爲其目的是爲_all_輸入文件創建_single_ PDF。例如,通過不帶引號的命令替換('\'... \'')作爲參數傳遞命令的輸出不健壯,並且使用帶有嵌入空格的文件名來中斷。 – mklement0

+0

yesssssss ....你是絕對正確的......「空間」......我從來沒有使用過它們......詭異......; DD – a2kpi