使用 exec 时,通配符在 cp 命令中不起作用

使用 exec 时,通配符在 cp 命令中不起作用

我想将所有目录中的所有文件复制到父目录,但出现错误

./img/* is not a directory

例如。这是我使用的命令。有没有更好的方法来做到这一点?

find . -type d -regex './[a-z]*' -exec cp -v {}/* .. \;

答案1

尝试:

find . -type d -regex './[a-z]*' -exec bash -c 'cp -v "$1"/* ..' Cp {} \;

讨论

考虑:

find . -type d -regex './[a-z]*' -exec cp -v {}/* .. \;

当 bash 看到此行时,它会对 执行路径名扩展{}/*。由于(通常)没有名为 的目录{},因此*保留为文字*。这不是您想要的。您需要进行路径名扩展 find已替换{}。通过将cp命令放在引号中并将其作为参数传递给bash -c,我们实现了该目标。

示例表格bash -c如下:

bash -c 'code...' a b c 

这告诉 bash 将 赋值a$0b$1c$2,然后执行code...。如果发生错误,shell 将使用$0作为正在执行的程序的名称(在错误消息中)。上面,我们选择Cp作为描述性名称。此外,如上所述,{}代替,我们在 中$1使用 use 。以这种方式使用时,不需要用引号引起来(但这样做也无妨);处理所需的任何转义。但是,内部应该用双引号引起来,以防止分词和路径名扩展。$1code...{}findcode...$1

答案2

这也可能有效

cd your_directory
cp -rp * /absolut_path_to_parent_directory

相关内容