使用 xargs 从目录中移动文件

使用 xargs 从目录中移动文件

我正在当前目录中搜索一些文件夹。我想要做的是将这些目录中的所有文件移动到另一个目录。我正在使用以下命令:

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)匹配EXPR1EXPR2
  • *(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") 
         }'

相关内容