【问题标题】:Find/Match variable filenames and move files to respective directory查找/匹配变量文件名并将文件移动到相应目录
【发布时间】:2013-03-15 17:14:34
【问题描述】:

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

在使用 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 的文件
  • 将匹配名称的_签名文件移动到找到的文件目录

感谢任何帮助/指导。

【问题讨论】:

    标签: bash variables find filenames mv


    【解决方案1】:

    使用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
    

    【讨论】:

    • 您的上一个版本也同样有效,感谢您的代码并对其进行了一些清理!
    【解决方案2】:

    我一直在处理一个类似的问题。由于将/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"
    }
    

    【讨论】:

    • 这是为了工作,而不是学校作业(我只是想表明我很难过问“为我做这个”)。感谢您的帮助:D
    猜你喜欢
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多