【问题标题】:Looping through find results in bash [duplicate]在bash中循环查找结果[重复]
【发布时间】:2019-01-31 18:06:20
【问题描述】:

我想遍历 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

【问题讨论】:

    标签: string bash shell


    【解决方案1】:

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

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

    ...或者,使用您原来的 shell 并完全避免 -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 的一部分。

    【讨论】:

    • 是的,_ {} + 绝对是一个改进。 (除非您遇到不支持它的 find!)
    • 自 2008 年以来它就是 POSIX 规范的一部分,因此任何声称在过去十年内符合要求的系统都应该拥有它。
    • 除非你被bash 的旧版本卡住(并且不想编写递归函数来遍历目录),否则for file in **/*.jpg; do [[ -f $file ]] || continue; convert ...; done 会更简单。
    • 这似乎把我推向了正确的方向,但仍然有一些麻烦。我认为这是因为文件夹结构中可能有空格。 convert-im6.q16: unable to open image `./newsubdir/some images/directories with spaces/filename with spaces.jpg': No such file or directory @ error/blob.c/OpenBlob/2701. 注意不同的引号。
    • @IngóVals,...我上面给出的代码没有任何特定于空间的错误。但是,当作为输入文件名的一部分给出时,您确定 [2048x2048] 是正确的吗?我从原版复制了它,但它看起来很可疑。同样值得确保您在 convert 命令功能周围拥有的任何其他包装器正确运行(在必要时引用等)。
    【解决方案2】:
    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 {} \; 调用它。这样做将有助于避免不可避免的引用问题。

    【讨论】:

    • 扩展${file:1} 不适用于sh。使用${file#?}
    • (...err,什么不可避免的引用问题?没有文字's,所以这里没有没有不可避免的引用问题)。
    • 不可避免的,因为最终有人想要在命令中添加功能,并且会遇到混乱。
    • @gniourf_gniourf 好收获!我通常不支持使用 bashism,但在这里显式调用 bash 似乎是最简单的解决方法。
    猜你喜欢
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    相关资源
    最近更新 更多