bash - 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; }
解决方案
正如评论中所说,它不起作用,因为您正在搜索文件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 {} +
推荐阅读
- android - 传统构造函数替代构造函数膨胀布局的区别
- python-3.x - 如何在python中同时获得分数幂或sqrt函数的值?
- mysql - 在一组列中选择相关值
- nest-device-access - 使用 .NET 客户端 API 获取嵌套设备列表
- javascript - 编码来自对象属性的链接?
- kubernetes - Azure kubernetes kube-proxy 解释
- c++ - c ++将参数传递给qsort比较器
- xcode - 在*子视图*中禁用手势识别器,以便超级视图手势识别器可以运行
- apache-spark - 如何在 Spark 2.4 的一台机器上启动多个 Spark 工作者?
- python - 垂直连接两个重叠的数据框