为什么 find 和 exec mv 不移动所有文件?

为什么 find 和 exec mv 不移动所有文件?

当前工作目录有多个测试文件,编号在 1 到 100 之间。这些文件的标题1.txt为 到100.txt

该命令find . -maxdepth 1 -regextype posix-egrep -regex '.*/[ -._&a-zA-Z0-9]+\.txt' -exec bash -c 'mv "$@" "TestDir - Level One"' {} +移动除一个之外的所有文件,例如15.txt.

相反,该命令find . -maxdepth 1 -regextype posix-egrep -regex '.*/[ -._&a-zA-Z0-9]+\.txt' -exec mv {} "TestDir - Level One"/ \;会移动所有文件。

如果find . -maxdepth 1 -regextype posix-egrep -regex '.*/[ -._&a-zA-Z0-9]+\.txt' -exec bash -c 'mv "$@" "TestDir - Level One"' {} +再次执行该命令,它将返回错误mv: missing destination file operand after 'TestDir - Level One' Try 'mv --help' for more information.

的版本findfind (GNU findutils) 4.7.0-git

答案1

$0您缺少对调用的字符串分配bash -c '…'。调用的第一个参数find被分配给$0(shell 的名称)而不是$1,因此不会被移动。

-c     如果-c存在该选项,则从第一个非选项参数 command_string 读取命令。如果command_string后面有参数,第一个参数被分配给位置参数$0,任何剩余的参数都被分配给位置参数。的赋值$0设置 shell 的名称,该名称用于警告和错误消息。

(强调我的)

将命令更改为

find . [more find options…] -exec bash -c 'mv "$@" "TestDir - Level One"' bash {} +

相关内容