我 从不 来问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
输出变成多个变量吗?我迷路了:(
我想在一些shell中实现这一点,但如果有Perl迷们或其他任何东西,我非常高兴另一个便携式解决方案。
我试图将其分解,但仍然不明白如何实现它......
感谢您的帮助/指导。
答案 0 :(得分: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
答案 1 :(得分: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
其中fetch_signed_version
是您编写的shell函数,给定/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"
}