查找/匹配变量文件名并将文件移动到相应的目录

时间:2013-03-15 17:14:34

标签: bash variables find filenames mv

从不 来问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迷们或其他任何东西,我非常高兴另一个便携式解决方案。

我试图将其分解,但仍然不明白如何实现它......

  • 找到与没有_signed
  • 的VarName匹配的文件
  • 将具有匹配名称的_signed文件移动到找到的文件目录

感谢您的帮助/指导。

2 个答案:

答案 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"
}