我想将所有目录中的所有文件复制到父目录,但出现错误
./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
给$0
、b
给$1
、c
给$2
,然后执行code...
。如果发生错误,shell 将使用$0
作为正在执行的程序的名称(在错误消息中)。上面,我们选择Cp
作为描述性名称。此外,如上所述,{}
代替,我们在 中$1
使用 use 。以这种方式使用时,不需要用引号引起来(但这样做也无妨);处理所需的任何转义。但是,内部应该用双引号引起来,以防止分词和路径名扩展。$1
code...
{}
find
code...
$1
答案2
这也可能有效
cd your_directory
cp -rp * /absolut_path_to_parent_directory