1

我写了一个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() 中有参数(完整路径)?

4

2 回答 2

1

Find 无法执行内部命令。

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

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

该过程bash在查找 $PATH 的环境中通过,但不通过它的内部。

您需要将该函数添加到 afile.sh中,使其可执行,在 $PATH 中添加脚本的路径 [如“。” 如果pwdof与 ]bash的位置相同,file.sh则在这些条件下执行。

于 2012-11-04T14:24:14.393 回答
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

解释这是做什么的:

  • 如果您这样做,则会生成一个新的 shell 来运行此脚本./find_stuff.sh
  • 首先它定义了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 $@- 这$@部分是您之前缺少的部分。

于 2012-11-04T15:36:53.847 回答