管道 '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 +

这样做更容易:

  1. 在您的 .zshrc 文件中,添加
    setopt extendedglob
    
    然后重启你的 shell.
  2. 这使您能够使用 ^ 运算符:
    mv ^A*(-.) Strings
    

经过第二天的进一步测试,我发现是我这边的一些不精确导致了错误...

正确的 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 的回答]