我有这个工作:

$ 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; }

#1楼 票数:1 已采纳

正如评论中所说,它不起作用,因为您正在搜索文件copy_*.txt并试图移动后缀为.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 {} +

  ask by user3313834 translate from so

未解决问题?本站智能推荐:

1回复

bash运行命令一段时间

我试图在 bash 中使用系统时间来运行一些命令。 这是我尝试过的简化版本 我将 10 秒添加到当前时间并在 while 循环内打印时间。 我看到的是程序运行超过 10 秒,我必须按 ctrl+C 才能停止。
2回复

为什么一段时间后代码是正确的?做……;从不在bash中调用完循环?

该脚本已在安装中列出。 但是,它只是挂起而不做任何事情。 它有什么问题吗? 我尝试在多台计算机上运行此脚本。 它应该说“完成!”
1回复

Bash是在一段时间内删除命令吗?

我真的不明白为什么会这样,bash似乎在while循环中运行时删除了命令。 我有以下脚本: 当我分别运行命令时,它很好用。 但是如果我像这样运行它,则会得到以下输出: 对于/ foo / bar中的每个文件。 因此,我尝试将命令以字符串形式返回给我,我更改为echo "adb p
3回复

当有一段时间没有输出时超时bash脚本

我有a.sh调用一个b.sh : 我如何编写一个条件来检测b.sh不输出log.txt一段时间,然后通过wait $!运行wait $!
2回复

如何循环一段时间?

我正在创建一个脚本,应该等到某个文件(例如stop.dat )出现或者经过一定时间(例如500秒)之后。 我知道如何等到文件出现: 如何在while循环中添加其他语句?
5回复

BashRun命令一段时间?

我正在制作一个 bash 脚本供我使用。 如何在特定时间(例如 20 秒)运行命令并终止命令? 我尝试了很多解决方案但没有任何效果,我也尝试了 timeout 命令但没有成功。 请给我一些解决方案。 例如:我想在 10 秒后在脚本和终端中运行此命令
1回复

在bash中运行多个并行sqlplus连接一段时间

我有这段代码可以创建 20 个并行 sqlplus 实例,执行一些查询并退出: 如果可能,我需要调整此代码,以便在以下条件下运行一个小时: 始终保持 20 个连接,如果一个 sqlplus 实例关闭(完成它的进程)另一个应该打开,我需要在 X 时间内保持一定数量的连接。 有什么我可以添加到这个代码来
1回复

无法在一段时间内使用变量并将其放入bash中

我有这样的代码 在这里,第一个回显是在“之后”,而第二个是在“之前”。 如何在“之后”进行第二次回显打印。 我认为是因为购买烟斗,我不知道该如何解决。 感谢您的任何解决方案... 答案编辑: 我更正了它,并且效果很好。 感谢eugene的有用回答