我正在尝试使用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] 删除。
我来说两句