如何解决管道命令结果列表移动mv命令——终端zsh
管道结果列表到命令 - ZSH
所以我想对目录的过滤 ls 结果列表调用 mv 命令:
print -l $(ls) | awk '$1 !~ /^A.*/ {print $0}'
这里返回我目录中的每个文件名不是以大写字母“A”开头...
现在我希望 mv 命令对每一个都调用,以便将它们移动到目录 ./Strings 中。
我的想法是添加xargs:
...| xargs -0 mv ./Strings
但这反而最终将我的“Strings”目录重命名为每个返回的文件名的组合,用问号(“?”)分隔 - -0 空字符标志的效果我想 xargs 命令...
有趣的是,xargs 命令(此处链接到德国站点:https://wiki.ubuntuusers.de/xargs/)上的 wiki 提供了一个示例代码片段,几乎可以解决我的问题(与我的问题非常相似)尝试),但不用说并不能解决我的问题。
find . -uid 1001 -print | xargs -i mv {} /tmp/Klaus/test
当我在我的上下文中尝试时,它会抱怨“xargs:非法选项 -- i”:
find . -regex '^[^A].*' -print | xargs -i mv {} ./Strings
find -exec cmd {} +
我对我的问题做了一些研究,通常弹出的是“为什么我不能将 find 结果传送到...”。
这就是为什么我不想用 find 命令和 -exec 标志留下解决方案的建议,尽管这并没有导致我想要的结果或者,不幸的是...:
find . -regex '^[^A].*' -exec mv {} ./Strings +
解决方法
这样做要容易得多:
- 在您的
.zshrc
文件中,添加
然后重启你的shell。setopt extendedglob
- 这使您能够使用
^
运算符:mv ^A*(-.) Strings
-
(-.)
匹配纯文件或指向纯文件的符号链接。如果您不想包含符号链接,请改用(.)
。 - 有关扩展 glob 语法的更多信息,请参阅 http://zsh.sourceforge.net/Doc/Release/Expansion.html#Filename-Generation。
⚠️ 注意扩展glob语法与正则表达式语法相似但不完全相同!
经过第二天的进一步测试,我发现导致错误的更多是我这边的不精确......
正确的 xargs 管道应如下所示:
| xargs -I '{}' mv {} ./Strings
解决方案 A
print -l $(ls) | awk '$1 ~ /^[^A].*/ {print}' | xargs -I '{}' mv {} ./Strings
解决方案 B
find . -type f -regex './[^A].*' | xargs -I '{}' mv {} ./Strings
解决方案 C*
mv ^[^A].*(.) Strings
[* 见@Marlon Richert 的回答]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。