使用 Find -exec 使用文件的 grep 内容重命名文件

使用 Find -exec 使用文件的 grep 内容重命名文件

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

分解的命令是:

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

find 获取我感兴趣的文件,-exec 部分中的 pdfgrep 提取出正确的字符串。

我想将 {} 中保存的文件 mv 到 pdfgrep 的输出。

我尝试过创建变量(使用 $()/ 反引号)和多个 -exec,但似乎没有任何效果。

有人有优雅的解决方案吗?

答案1

对于单个文件,$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}" )" ';'

实际上,如果没有添加子 shell,也可以工作......现在我想起来了。但我觉得调用子 shell 会更安全,因为-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 -cdirname

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

相关内容