我正在当前目录中搜索一些文件夹。我想要做的是将这些目录中的所有文件移动到另一个目录。我正在使用以下命令:
find -maxdepth 1 -regex 'myRegexExpHere' | xargs -I file mv file/* Desktop/New\ folder/
但正如预期的那样,“*”不会被 xargs 扩展,而是在每个文件夹中搜索名为 * 的文件。我应该做什么来实现我的目标?请建议仅涉及使用 xargs (而不是 find 的 -exec 开关)的方法,主要是因为我读到使用 xargs 效率更高。
答案1
file
您需要在被匹配文件的名称替换后执行的 shell 中进行通配符的扩展。所以你需要从 启动一个 shell xargs
。
xargs
使用exec
谓词 to比 using 更好find
。它更简单,并且不会遇到引用问题。
find -maxdepth 1 -regex 'myRegexExpHere' -exec sh -c 'mv "$0"/* Desktop/New\ folder/' {} \;
你可能把事情过于复杂化了。这种简单的用法find
可以直接在大多数 shell 中表达。 Ksh 有一个正则表达式语法:
@(EXPR1|EXPR2)
匹配EXPR1
或EXPR2
*(EXPR)
匹配 0 次或多次出现EXPR
+(EXPR)
匹配 1 次或多次出现EXPR
?(EXPR)
匹配 0 或 1 次出现EXPR
如果您先运行,则此语法在 bash 中也可用shopt -s extglob
;如果您setopt ksh_glob
先运行,则在 zsh 中也可用。然后你可以使用
mv REGEX/* Desktop/New\ folder/
答案2
find
当不需要递归时为什么要使用?使用 shell(我假设这里是 Bash,修改以满足您的需要)进行正则表达式匹配:
for dir in */;do
if [[ "$dir" =~ yourRegexHere ]];then
mv -- "$dir"/* "Desktop/New folder/"
fi
done
如果您的 shell 的正则表达式功能对于您的要求来说太弱,那么它不会比 Perl 更好:
perl -e 'for(grep {/yourRegexHere/} glob "*/"){
qx(mv -- "$_"/* "Desktop/New folder")
}'