首页 > 解决方案 > 在bash中循环查找结果

问题描述

我想遍历jpg文件,find用来定位它们。

结果是完整的路径名,包括./前面。我想删除替换./为,./newsubdir/以便可以将其用作进程中的输出文件名,使用相同的文件夹结构在newsubdir中创建原始文件的修改副本。

这是我尝试过的。

#!/bin/bash

find . -type f -name '*jpg' 
    for file do
        echo ${file:1}
    done

然而,子字符串提取似乎根本不起作用。是否有这样做的原因或不同的方式来做到这一点。对Bash非常陌生。

我想要这样的事情作为最终结果。试图整理一堆图片,但保持文件夹结构。

#!/bin/bash

find . -type f -name '*jpg' 
    for file do
        convert '$file[2048x2048]' -gravity center -extent 2048x2048 "./newsubdir${file:1}"
    done

标签: stringbashshell

解决方案


你很亲近!更接近原始代码(从而避免启动不必要的外壳):

#!/bin/bash

find . -type f -name '*.jpg' -exec bash -c '
    for file do
        convert "$file[2048x2048]" -gravity center -extent 2048x2048 "./newsubdir${file:1}"
    done
' _ {} +

...或者,使用您原来的外壳并-exec完全避免:

#!/bin/bash
while IFS= read -r -d '' file; do
    convert "$file[2048x2048]" -gravity center -extent 2048x2048 "./newsubdir${file:1}"
done < <(find . -type f -name '*.jpg' -print0)

这些模式以及更多模式是UsingFind的一部分。


推荐阅读