管道 'find' 命令结果列表移动 (mv) 命令 – 终端 (zsh)
Pipe 'find' command result list to move (mv) command – Terminal (zsh)
管道结果列表到命令 - ZSH
所以我想在目录的过滤 ls 结果列表上调用 mv 命令:
print -l $(ls) | awk ' !~ /^A.*/ {print [=11=]}'
这里返回我目录中的每个文件名不是以大写“A”开头...
现在我希望对其中的每一个调用 mv 命令,以便将它们移动到目录 ./Strings 中。
我的做法是添加 xargs:
...| xargs -0 mv ./Strings
但这最终导致将我的“字符串”目录重命名为每个返回的文件名的组合,这些文件名以问号(“?”)分隔 - -0[=48= 的效果] 我想 xargs 命令的空字符标志...
有趣的是,xargs 命令上的 wiki(link 到此处的德语站点:https://wiki.ubuntuusers.de/xargs/)提供了一个示例代码片段几乎是我的问题(与我的尝试非常相似),但不用说不能解决我的问题。
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 标志的解决方案的建议,尽管那没有不幸的是,这也导致了我想要的结果......:[=17=]
find . -regex '^[^A].*' -exec mv {} ./Strings +
这样做更容易:
- 在您的
.zshrc
文件中,添加
setopt extendedglob
然后重启你的 shell.
- 这使您能够使用
^
运算符:
mv ^A*(-.) Strings
(-.)
匹配普通文件或指向普通文件的符号链接。如果您不想包含符号链接,请改用 (.)
。
- 有关扩展 glob 语法的详细信息,请参阅 http://zsh.sourceforge.net/Doc/Release/Expansion.html#Filename-Generation。
⚠️ Note that extended glob syntax is similar to but not exactly the same as regular expression syntax!
经过第二天的进一步测试,我发现是我这边的一些不精确导致了错误...
正确的 xargs 管道应该如下所示:
| xargs -I '{}' mv {} ./Strings
解决方案 A
print -l $(ls) | awk ' ~ /^[^A].*/ {print}' | xargs -I '{}' mv {} ./Strings
解决方案 B
find . -type f -regex './[^A].*' | xargs -I '{}' mv {} ./Strings
解决方案 C*
mv ^[^A].*(.) Strings
[* 请参阅@Marlon Richert 的回答]
管道结果列表到命令 - ZSH
所以我想在目录的过滤 ls 结果列表上调用 mv 命令:
print -l $(ls) | awk ' !~ /^A.*/ {print [=11=]}'
这里返回我目录中的每个文件名不是以大写“A”开头...
现在我希望对其中的每一个调用 mv 命令,以便将它们移动到目录 ./Strings 中。
我的做法是添加 xargs:
...| xargs -0 mv ./Strings
但这最终导致将我的“字符串”目录重命名为每个返回的文件名的组合,这些文件名以问号(“?”)分隔 - -0[=48= 的效果] 我想 xargs 命令的空字符标志...
有趣的是,xargs 命令上的 wiki(link 到此处的德语站点:https://wiki.ubuntuusers.de/xargs/)提供了一个示例代码片段几乎是我的问题(与我的尝试非常相似),但不用说不能解决我的问题。
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 标志的解决方案的建议,尽管那没有不幸的是,这也导致了我想要的结果......:[=17=]
find . -regex '^[^A].*' -exec mv {} ./Strings +
这样做更容易:
- 在您的
.zshrc
文件中,添加
然后重启你的 shell.setopt extendedglob
- 这使您能够使用
^
运算符:mv ^A*(-.) Strings
(-.)
匹配普通文件或指向普通文件的符号链接。如果您不想包含符号链接,请改用(.)
。- 有关扩展 glob 语法的详细信息,请参阅 http://zsh.sourceforge.net/Doc/Release/Expansion.html#Filename-Generation。
⚠️ Note that extended glob syntax is similar to but not exactly the same as regular expression syntax!
经过第二天的进一步测试,我发现是我这边的一些不精确导致了错误...
正确的 xargs 管道应该如下所示:
| xargs -I '{}' mv {} ./Strings
解决方案 A
print -l $(ls) | awk ' ~ /^[^A].*/ {print}' | xargs -I '{}' mv {} ./Strings
解决方案 B
find . -type f -regex './[^A].*' | xargs -I '{}' mv {} ./Strings
解决方案 C*
mv ^[^A].*(.) Strings
[* 请参阅@Marlon Richert 的回答]