使用Find -exec重命名带有grepped文件内容的文件

安卓

我正在尝试使用find获取文件列表,然后使用pdfgrep从文件中获取字符串,然后使用该字符串重命名文件。

分解的命令是:

find . -name "*PayrollSelfBill_42652301*" -exec pdfgrep {}  -o -e "42652301-.{10}"

找到我感兴趣的文件后,-exec部分中的pdfgrep会提取正确的字符串。

我想将{}中保存的文件转换为pdfgrep的输出。

我试过创建变量(使用$()/反引号)和多个-execs,但是似乎什么也无法工作。

有谁有优雅的解决方案?

库萨兰达

对于单个文件,$filename如果我理解正确的话,您可能想做类似的事情

mv -i "$filename" "$( pdfgrep "$filename" -o -e "42652301-.{10}" )"

...假设$filename是当前目录中的文件名。对?如果没有,下面的代码也不正确...

好吧,让我们把它插入到find具有-execdir

find . -type f -name "*PayrollSelfBill_42652301*" -execdir sh -c '
    filename=$1
    mv -i "$filename" "$( pdfgrep "$filename" -o -e "42652301-.{10}" )"' sh {} ';'

这将找到您感兴趣的文件,并在与找到文件的目录相同的目录中运行脚本片段(这-execdir与有所不同-exec)。

有可能

find . -type f -name "*PayrollSelfBill_42652301*" \
    -execdir mv -i {} "$( pdfgrep {} -o -e "42652301-.{10}" )" ';'

实际上,在没有添加子外壳的情况下,它也可以工作...现在,我考虑了一下。但是我会更安全地调用子外壳,因为这-execdir是的非标准选项find


假设$pathname是找到的文件之一,但是它不在当前目录中,那么以下操作将对该文件执行相同的操作:

mv -i "$pathname" "${pathname%/*}/$( pdfgrep "$pathname" -o -e "42652301-.{10}" )"

在这里,${pathname%/*}将展开到找到的文件的目录(与相同$( dirname "$pathname" ))。

这可能有效

find . -type f -name "*PayrollSelfBill_42652301*" \
    -exec  mv -i {} "$( dirname {} )/$( pdfgrep {} -o -e "42652301-.{10}" )" ';'

但是我们可以更有效率,并可以-exec ... {} +批量处理一堆文件:

find . -type f -name "*PayrollSelfBill_42652301*" -exec sh -c '
    for pathname do
        mv -i "$pathname" "${pathname%/*}/$( pdfgrep "$pathname" -o -e "42652301-.{10}" )"
    done' sh {} +

-execdir上面解决方案的不同之处在于,仅sh -c将启动一个(或很少)脚本,并且脚本将被dirname更快的替换所取代,从而使其可能比之前的变体更快。

与此答案中的两种变化相关:

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章