将find的结果传递给自定义bash函数?

时间:2017-01-25 07:11:46

标签: bash function shell loops find

我有自定义bash测试功能

main () {
    list=$1
    for i in ${list}; do
        echo $i
    done
}

我打算称之为:

main `find . -name hello` 

但它只回显列表中传递的第一个文件。 find . -name hello的原始输出是

./world1/hello
./world2/hello
./world3/hello
./world4/hello
./world5/hello
./world6/hello
./world7/hello
./world8/hello

如何确保整个清单通过?

谢谢!

1 个答案:

答案 0 :(得分:2)

使用正确的Process-Substitution语法循环文件,如果您希望对来自{的每个文件执行某项操作,则需要一个功能{1}}输出,只需执行

find

(或)如果您害怕文件名中有特殊字符(如空格或任何元字符),请使用#!/bin/bash while IFS= read -r file do echo "$file" # Your other actions on "$file" go here done < <(find . -type f -name "hello") 选项(如果支持-print0包)将GNU findutils去限制器上的文件分开,并使用相同的去限制器将其读回。

\0

我只是简单地 NOT 建议使用这种方式的功能,但你可以做类似的事情,

while IFS= read -r -d '' file
do
    echo "$file"
    # Your other actions on "$file" go here
done < <(find . -type f -name "hello" -print0)

(或)更简单地做,

function findRead() {   
    while IFS= read -r file
    do
        echo "$file"
        # Your other actions on "$file" go here
     done <<<"$1"    
}

findRead "$(find . -type f -name "hello")"

这里的关键是双引号返回function findRead() { for file in "$1" do echo "$file" done } findRead "$(find . -type f -name "hello")" 输出的$(..)命令替换,以保留新行字符,然后将其输入到自定义函数中。