0

体系的に番号が付けられたフォルダーにいくつかのpdfがある状況にあります

文書 fd13.pdf 文書 fd30.pdf 文書 fd47.pdf 文書 fd14.pdf 文書 fd31.pdf 文書 fd48.pdf 文書 fd15.pdf 文書 fd32.pdf 文書 fd49.pdf 文書 fd16.pdf 文書 fd33.pdf 文書 fd50.pdf

それらをpdfに変換するスクリプトを書いています

スクリプトは次のとおりです

    #!/bin/bash
    pdftk "document fd1.pdf" "document fd2.pdf" "document fd3.pdf" 
"document fd4.pdf" "document fd5.pdf" "document fd6.pdf" 
"document fd7.pdf" "document fd8.pdf" "document fd9.pdf" "document fd10.pdf" 
"document fd11.pdf" "document fd12.pdf" "document fd12a.pdf" "document fd12b.pdf" 
"document fd12c.pdf" "document fd12d.pdf" "document fd13.pdf" "document fd14.pdf"
 "document fd15.pdf" "document fd16.pdf" "document fd17.pdf" "document fd18.pdf" 
output out.pdf

これも機能しますが、

私の問題は、最初にディレクトリで ls を実行することです

ls ./  > script.sh

次に、そのような ls 出力ドキュメント fd11.pdf では、ドキュメント fd1.pdfの 前に来
て、それらをスクリプトで使用できるようにするには、ファイル名に二重引用符を追加する必要があるため、1 桁の数字と 2 桁の数字を並べ替える必要があり ます。 " " この部分は手動で行う必要があります。

ファイル名への二重引用符の追加を自動化し、ファイル名をソートされた順序で取得したいのですが、これら 2 つの問題にどのように対処すればよいですか?

私はUbuntu 12.04を使用しています

4

1 に答える 1

1

これは引用の問題です。

デモンストレーションについては、スクリプトを見てくださいdemo1.sh

declare -a args=( "$@" ) 
echo ${#args[@]}  # count the elements of the array args

bash demo1.sh *pdf正しい数のpdfファイルが表示されます。

代わりにスクリプト demo2.sh を使用する場合

declare -a args=( $@ )
echo ${#args[@]}  # count the elements of the array args

bash demo2.sh *pdfpdfファイルの数ではありません。代わりに、各ファイルを 2 回カウントします。

man bash説明については、次を参照してください。

@ 1 から始まる定位置パラメーターに展開されます。展開が二重引用符内で発生すると、各パラメーターは個別の単語に展開されます。つまり、"$@" は "$1" "$2" と同等です ... 二重引用符で囲まれた展開が単語内で発生した場合、最初のパラメーターの展開は元の単語の先頭部分と結合され、最後のパラメーターの展開は、元の単語の最後の部分と結合されます。位置パラメータがない場合、"$@" と $@ は何も展開されません (つまり、それらは削除されます)。

次のスクリプトが機能するはずです。

#!/bin/bash
pdftk "${@}" output out.pdf

そして、あなたはそれを呼び出すことができます:

ls -Q -v *.pdf |xargs script
于 2013-03-06T19:15:22.040 に答える