将输出命令保存到变量中并编写for循环

3

我想编写一个Shell脚本。使用下面的命令行列出嵌套子目录中的jpg文件:

find . -type f -name "*.jpg"

我该如何将这个命令的输出保存到一个变量中,并为此编写一个for循环?(我想对每个jpg文件执行一些处理步骤)

2个回答

3
您不想将包含多个文件的输出存储到变量/数组中,然后稍后进行后处理。您可以直接在运行时对文件执行这些操作。
假设您有可用的bash shell,您可以编写一个小脚本,如下所示:
#!/usr/bin/env bash
#              ^^^^ bash shell needed over any POSIX shell because
#                   of the need to use process-substitution <()

while IFS= read -r -d '' image; do
    printf '%s\n' "$image"
    # Your other actions can be done here
done < <(find . -type f -name "*.jpg" -print0)
< p > -print0选项会在文件名末尾添加一个空字节终止符,然后使用read命令读取该终止符。这将确保处理包含特殊字符的文件名时不会出现问题。


1
比将值存储在变量中更好的方法是使用以下代码:

find . -type f -name "*.jpg" -exec command {} \;

即使你想要,命令也可以是一个臃肿的shell脚本。
演示胜过解释,不是吗?将整个行复制粘贴到终端中:
cat<<'EOF' >/tmp/test
#!/bin/bash

echo "I play with $1 and I can replay with $1, even 3 times: $1"
EOF
chmod +x /tmp/test
find . -type f -name "*.jpg" -exec /tmp/test {} \;

编辑:新演示(来自评论中的新问题)

find . -type f -name "*.jpg" | head -n 10 | xargs -n1 command

(这个解决方案不考虑文件名中包含换行符或空格的情况)

这个解决方案会处理:

#!/bin/bash

shopt -s globstar

count=0

for file in **/*.jpg; do
    if ((++count < 10)); then
        echo "process file $file number $count"
    else
        break
    fi
done

那么,我如何在不使用循环遍历jpg文件列表的情况下单独选择每个jpg文件?此外,我可以在命令{}中编写多个命令吗? - Mehdi
添加了简单的for循环,更适合您的需求。 - Gilles Quénot
仅使用最新的解决方案。 - Gilles Quénot
嗨,我给你所有需要的东西(3个解决方案),现在是测试和阅读文档的时间;) - Gilles Quénot
请清理无用的注释。 - Gilles Quénot
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接