将查找结果传递给自定义函数

时间:2012-11-04 13:57:00

标签: bash find exec

我写了一个bash脚本:

   #!/bin/bash
    function test_echo
    {
        echo $0
        echo $1
        echo $2
        echo $#
    }
    test_echo

我试试:

find test.sh -type f -exec test_echo '{}' \;

find . -type f -exec `./test.sh {}` \;

但它不起作用。

我需要一种方法来扫描文件夹中的文件(我使用find),并为每个文件调用一个函数(foo_fonction()),在参数中包含文件的完整路径。

 find . -type f -exec foo_fonction '{}' \; 

如何在foo_fonction()中使用参数(完整路径)?

2 个答案:

答案 0 :(得分:1)

查找无法执行内部命令。

它只能执行磁盘上的命令。

解释很简单:当进程find启动时,它无法在启动它的进程的环境中看到(在这种情况下由bash分叉)内部命令。

进程bash在查找$ PATH的环境中传递,但不传递它的内部。

您需要将该函数添加到file.sh中,使其成为可执行文件,在$ PATH [like“中添加脚本的路径。如果pwd的{​​{1}}与bash]的位置相同,则在这些条件下执行。

答案 1 :(得分:0)

有两种方法可以解决这个问题:

1:您可以将函数定义作为查找文件脚本的一部分:

(我们称之为find_stuff.sh

#!/bin/bash

test_echo() {
    echo $0
    echo $1
    echo $2
    echo $#
}

files=$(find $(pwd) -type f)
for f in $files
do
    test_echo "$f"
done

解释这是做什么的:

  • 如果您执行./find_stuff.sh
  • ,则会生成一个新的shell来运行此脚本
  • 首先定义test_echo()函数
  • 然后以递归方式查找当前工作目录下的所有文件
  • 请注意,由于我们将$(pwd)指定为搜索目录,这将是一个绝对路径,find返回的结果也将是绝对路径 - 正如您所希望的那样。
  • 然后,对于每个文件,将其文件路径传递给test_echo函数

2:将函数定义放在其他位置,但仍需要find_stuff.sh脚本:

#!/bin/bash

files=$(find $(pwd) -type f)
for f in $files
do
    ./test.sh "$f"
done

test.sh应如下所示:

#!/bin/bash

test_echo () {
    echo $0
    echo $1
    echo $2
    echo $#
}

test_echo $@

请注意最后一行test_echo $@ - $@部分是您之前缺少的部分。