首页 > 解决方案 > bash:使用参数从一段时间内调用函数

问题描述

我有这个工作:

$ find . -name 'copy_*.txt' |while read i ; do echo $i; git mv $i ${i%.txt}.cob ;done

我想在 bash 函数中有主体:

$ my_mv () { echo $1; mv $1 ${1%.cob}.toto; } 

然后调用它:

$ find . -name 'copy_*.txt' |while read i ;do my_mv $i; done

但我得到一个静默执行,没有任何附加:

$ my_mv () { echo $1; mv $1 ${1%.cob}.toto; }
$ find . -name 'copy_*.txt' |while read i ;do my_mv $i; done
$ 

与:

$ my_mv () { printf '%s\n' $1; mv $1 ${1%.cob}.toto; }

标签: bash

解决方案


正如评论中所说,它不起作用,因为您正在搜索文件copy_*.txt并试图移动带有 suffix 的文件.cob。此外,您的变量没有被引用,并且会导致文件名中的空格出现问题。

导出您的函数以使其my_mv可用find并用于-exec防止包含换行符的文件名出现问题:

my_mv () { for i; do echo "$i"; mv "$i" "${i%.cob}.toto"; done; } 
export -f my_mv
find . -name 'copy_*.cob' -exec bash -c 'my_mv "$@"' bash {} +

使用小型 shell 脚本而不是函数通常更容易:

find . -name 'copy_*.cob' -exec sh -c '
  for i; do
    echo "$i"
    mv "$i" "${i%.cob}.toto"
  done
' sh {} +

或者将代码移动到 shell 脚本中mymv.sh

#!/bin/sh

for i; do
  echo "$i"
  mv "$i" "${i%.cob}.toto"
done

并执行脚本find

find . -name 'copy_*.cob' -exec ./mymv.sh {} +

推荐阅读