0

SOに「宿題をしてください」と頼んだことはありませんが、どこから始めればいいのか本当にわかりません。

JSignPdfを使用して自動署名された後、ディレクトリにダンプされるドキュメントがたくさんあります(--output-directoryオプションには、入力と同じように出力する機能がないようです):

/some/dir/Signed/PDF1_signed.pdf
/some/dir/Signed/PDF2_signed.pdf
/some/dir/Signed/PDF2_signed.pdf

次に、ソース/署名されていない対応物を見つけたいと思います:

/some/dir/with/docs/PDF1.pdf
/some/dir/where/is/PDF2.pdf
/some/dir/why/this/PDF3.pdf

...署名済みの PDF をそれぞれのディレクトリに移動します。

コマンドを使用して、さまざまなディレクトリにあるすべての PDF を検索します。

find . -name '*.pdf' -exec sh -c 'exec java -jar jsignpdf-1.4.3/JSignPdf.jar ... ' sh {} +

...そして、find出力を変数にしてから、IF THENを使用して一致させるなどのことを試みましたが、成功しませんでした。find出力を複数の変数にする必要がありますか? 私はとても迷っています:(

私はこれを何らかのシェルで実現したいと考えていますが、Perl ジャンキーや他の何かが存在する場合は、別の移植可能なソリューションがあれば幸いです。

私はそれを分解しようとしましたが、まだそれを達成する方法を理解していません...

  • _signed なしで VarName に一致するファイルを見つける
  • 一致する名前の _signed ファイルを、見つかったファイルのディレクトリに移動します

ヘルプ/ガイダンスをありがとう。

4

2 に答える 2

2

whileループを使用して、見つかった各ファイルを読み取りfind、正しい場所に移動します。

find /some/dir -name "*.pdf" ! -name "*_signed.pdf" -print0 | while IFS= read -d '' -r file
do
  f="${file##*/}"
  mv "/some/dir/Signed/${f%.*}_signed.pdf" "${file%/*}"
done
于 2013-03-15T17:39:04.793 に答える
1

私が取り組んできた同様の問題があります。に変換するために必要なパス操作/some/dir/where/is/PDF2.pdf/some/dir/Signed/PDF2_signed.pdfかなり単純ですが、単純なワンライナーで実行できるよりも複雑であるfindため、最初のセットを見つけるために使用し、単純なループを使用して一度に 1 つずつ処理しています。あなたは宿題について言及したので、あまり多くのコードを与えないようにします。

find /dir/containing/unsigned -name '*.pdf' -print0 | while IFS= read -d path; do
    fetch_signed_version "$path"
done

ここfetch_signed_versionで、 はシェル関数で、 などのパスを指定すると/some/dir/where/is/PDF2.pdf、ディレクトリを抽出し ( /some/dir/where/is)、署名付き PDF の名前を計算し ( PDF2_signed.pdf)、必要な移動を実行します ( mv /some/dir/Signed/$signed_pdf /some/dir/where/is)


fetch_signed_version実際には非常に簡単です:

fetch_signed_version () {
   dir=${1%/*}
   fname=${1##*/}
   signed_name=${fname%.pdf}_signed.pdf
   mv "/some/dir/Signed/$signed_name" "$dir"
}
于 2013-03-15T17:37:18.947 に答える