首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查找与sed一起使用的-exec文件重命名不起作用

查找与sed一起使用的-exec文件重命名不起作用
EN

Stack Overflow用户
提问于 2017-10-19 06:55:27
回答 1查看 245关注 0票数 0

我一直在努力:

代码语言:javascript
运行
复制
find dev-other -name '*.flac' -type f -exec echo $(echo {} | sed 's,^[^/]*/,,') \;

我希望看到.flac文件在dev-other中的路径列表,但没有预先添加的dev-other/,例如:

代码语言:javascript
运行
复制
4515/11057/4515-11057-0095.flac
4515/11057/4515-11057-0083.flac
4515/11057/4515-11057-0040.flac
4515/11057/4515-11057-0105.flac
4515/11057/4515-11057-0017.flac
4515/11057/4515-11057-0001.flac

相反我看到了

代码语言:javascript
运行
复制
dev-other/4515/11057/4515-11057-0095.flac
dev-other/4515/11057/4515-11057-0083.flac
dev-other/4515/11057/4515-11057-0040.flac
dev-other/4515/11057/4515-11057-0105.flac
dev-other/4515/11057/4515-11057-0017.flac

为什么sed替换在这里不能工作,即使它自己工作

代码语言:javascript
运行
复制
$ echo $(echo dev-other/4515/11057/4515-11057-0047.flac | sed 's,^[^/]*/,,')
4515/11057/4515-11057-0047.flac

我第一次尝试了扩展:

代码语言:javascript
运行
复制
find dev-other -name '*.flac' -type f -exec a={} echo ${a#*/} \;

但得到了错误:

代码语言:javascript
运行
复制
find: a=dev-other/700/122866/700-122866-0001.flac: No such file or directory
find: a=dev-other/700/122866/700-122866-0030.flac: No such file or directory
find: a=dev-other/700/122866/700-122866-0026.flac: No such file or directory
find: a=dev-other/700/122866/700-122866-0006.flac: No such file or directory
find: a=dev-other/700/122866/700-122866-0010.flac: No such file or directory
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-19 07:28:11

在使用find-exec选项时,您可以只对用例使用参数展开,

代码语言:javascript
运行
复制
find dev-other -name '*.flac' -type f -exec bash -c 'x=$1; y="${x#*/}"; echo "$y"' bash {} \;

我使用了一个单独的shell (使用bashsh),使用bash -c,因为要涉及涉及参数展开的单独字符串操作。将find结果的每个输出作为参数传递给进行此操作的子shell。

bash -c执行一个命令时,命令之后的下一个参数被用作$0 (脚本在进程列表中的“名称”),随后的参数成为位置参数($1$2等)。这意味着由find传递的文件名(代替{})将成为脚本--的第一个参数,并由$1在迷你脚本中引用。

如果不想使用额外的bash,可以就地使用_

代码语言:javascript
运行
复制
find dev-other -name '*.flac' -type f -exec bash -c 'x=$1; y="${x#*/}"; echo "$y"' _ {} \;

其中_ i是一个bash预定义变量(例如在dash中没有定义):“在shell启动时,设置为用于调用环境或参数列表中传递的shell或shell脚本的绝对路径名称”(参见man特殊参数部分)。

值得一看的使用查找-复杂操作

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46824196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档