有没有办法找到执行我在shell中定义的函数?
例如:
dosomething () {
echo "Doing something with $1"
}
find . -exec dosomething {} \;
其结果是:
find: dosomething: No such file or directory
有没有办法让find's -exec看到做某事?
有没有办法找到执行我在shell中定义的函数?
例如:
dosomething () {
echo "Doing something with $1"
}
find . -exec dosomething {} \;
其结果是:
find: dosomething: No such file or directory
有没有办法让find's -exec看到做某事?
当前回答
在{}中添加引号,如下所示:
export -f dosomething
find . -exec bash -c 'dosomething "{}"' \;
这将纠正由于find返回的特殊字符而导致的任何错误, 例如文件名中带有圆括号的文件。
其他回答
我发现最简单的方法如下,一次重复两个命令:
func_one () {
echo "The first thing with $1"
}
func_two () {
echo "The second thing with $1"
}
find . -type f | while read file; do func_one $file; func_two $file; done
对于那些正在寻找一个Bash函数,将在当前目录下的所有文件上执行给定命令的人,我从上面的答案中编译了一个:
toall(){
find . -type f | while read file; do "$1" "$file"; done
}
注意,它不使用包含空格的文件名(见下文)。
以这个函数为例:
world(){
sed -i 's_hello_world_g' "$1"
}
假设我想在当前目录的所有文件中将“hello”的所有实例更改为“world”。我会这样做:
toall world
为了确保文件名中的符号安全,请使用:
toall(){
find . -type f -print0 | while IFS= read -r -d '' file; do "$1" "$file"; done
}
(但是你需要一个处理-print0的find,例如GNU find)。
以这种方式执行函数是不可能的。
为了克服这个问题,你可以把你的函数放在一个shell脚本中,然后从find调用它
# dosomething.sh
dosomething () {
echo "doing something with $1"
}
dosomething $1
现在在find as中使用它:
find . -exec dosomething.sh {} \;
不直接,不。Find在一个单独的进程中执行,而不是在您的shell中执行。
创建一个shell脚本,完成与函数相同的工作,并找到can -exec。
find . | while read file; do dosomething "$file"; done