0

我从来没有来过问“做我的功课”,但我真的不知道从哪里开始。

在使用 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输出制成多个变量吗?我迷路了:(

我想在某个 shell 中完成这项工作,但如果那里有 Perl 爱好者或其他任何东西,我会非常高兴有另一个可移植的解决方案。

我试图打破它,但仍然不明白如何完成它......

  • 查找匹配 VarName 而没有 _signed 的文件
  • 将具有匹配名称的 _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定位第一组,并使用一个简单的循环一次处理一个。你确实提到了作业,所以我尽量不给你太多代码。

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

您编写的 shell 函数在哪里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 回答