在bash中循环查找结果

时间:2019-01-31 18:06:20

标签: string bash shell

我想遍历 jpg 文件,使用find找到它们。

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

这就是我尝试过的。

#!/bin/bash

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

但是,子字符串提取似乎根本不起作用。是否有这样做的原因或其他方式。 重击非常新。

我最终想要这样的事情。尝试对一堆图片进行正方形处理,但保持文件夹结构。

#!/bin/bash

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

2 个答案:

答案 0 :(得分:2)

您接近了!粘一点更接近原始代码(和因此避免开始超过必要的弹):

#!/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的一部分。

答案 1 :(得分:1)

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

坦率地说,我认为编写脚本进行转换并仅使用find . -type f -name '*.jpg' -exec script {} \;进行调用要好得多。这样做将有助于避免不可避免的报价问题。