双引号与Bash中的星号文件名扩展
发布时间:2020-12-15 21:46:54 所属栏目:安全 来源:网络整理
导读:在目录?/ temp / a / foo /和?/ temp / b / foo foo /我有一些名为bar1,bar2,bar bar1,bar bar2等的文件. 我正在尝试编写一行Bash,将包含“foo”的目录中的所有这些文件作为名称的最后一部分复制到相应“foo”文件夹上方的文件夹中. 只要文件名中没有空格,这
在目录?/ temp / a / foo /和?/ temp / b / foo foo /我有一些名为bar1,bar2,bar bar1,bar bar2等的文件.
我正在尝试编写一行Bash,将包含“foo”的目录中的所有这些文件作为名称的最后一部分复制到相应“foo”文件夹上方的文件夹中. 只要文件名中没有空格,这是一项简单的任务,但在处理foo foo目录时,以下两个命令会失败: for dir in `find . -type d -name '*foo'` ; do cp $dir/* "$(echo $dir|sed 's_foo__g')" ; done (cp命令无法将“foo foo”的最后一个foo视为同一目录名的一部分.) for dir in `find . -type d -name '*foo'` ; do cp "$dir/*" "$(echo $dir|sed 's_foo__g')" ; done (“$dir / *”未展开.) 尝试将$dir / *替换为“$(echo $dir / *)”的尝试更不成功. 是否有一种简单的方法来扩展$dir / *以便cp理解? 解决方法
for循环不仅错误 – sed也不适合这项工作.
while IFS= read -r -d '' dir; do cp "$dir" "${dir/foo/}" done < <(find . -type d -name '*foo' -print0) 在find(和IFS = read -r -d”)上使用-print0可确保带有换行符的文件名不会弄乱你. 使用< <(...)构造确保如果循环内部设置变量,更改目录状态或执行类似的操作,那些更改将继续存在(管道的右侧位于bash的子shell中,因此管道进入while循环意味着在while循环中进行的shell状态的任何更改都会在其退出时被丢弃. 使用${dir / foo /}比调用sed更有效,因为它在bash内部执行字符串替换. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- scala – 监控关闭的图形Akka Stream
- 《数据结构》信管1131和1132班同学链接
- 在Angular中导入和使用lodash的正确方法
- angularjs – 是否可以在$routeProvider声明中访问$routePa
- AngularJS – $cancelRequest在$resource中不可用
- [WebServices]之三:动态调用 WebService
- Bash:“rm -d”和“rm -R”有什么区别?
- angularjs – Ionic Framework键盘隐藏输入字段
- 【WebService】——契约优先
- Angular 2监视组件属性,用于没有@Input或@Output的更改