Bash 如何使用globstar复制目录中的所有文件?

Bash 如何使用globstar复制目录中的所有文件?,bash,shell,pattern-matching,glob,shopt,Bash,Shell,Pattern Matching,Glob,Shopt,假设我要将dir中的所有文件复制到dest: $ tree . . ├── dest └── dir ├── dir │   ├── file1 │   └── file2 └── file3 如果我知道文件名和目录深度,这很容易: $ echo dir/f* dir/*/* dir/file3 dir/dir/file1 dir/dir/file2 $ cp dir/f* dir/*/* dest/ $ tree dest/ dest/ ├── file1

假设我要将
dir
中的所有文件复制到
dest

$ tree .
.
├── dest
└── dir
    ├── dir
    │   ├── file1
    │   └── file2
    └── file3
如果我知道文件名和目录深度,这很容易:

$ echo dir/f* dir/*/*
dir/file3 dir/dir/file1 dir/dir/file2

$ cp dir/f* dir/*/* dest/

$ tree dest/
dest/
├── file1
├── file2
└── file3
使用globstar也很容易只获取目录:

$ echo dir/**/*/
dir/dir/
但是我不知道如何glob只有文件,例如,以下内容不起作用:

$ echo dir/**/*!(/)
dir/**/*!(/)

一个选项是使用
find
-type f
选项:

find dir -type f -exec cp {} dest \;

“只有文件”是什么意思?要排除空目录吗?(AFAIK)不能排除所有具有扩展全局的目录。像
*这样的模式!(/)
不起作用,
!(*/)
挂起shell。@CommuSoft:我想排除所有目录,就像
dir/f*dir/*/*
那样。这不起作用。在
-exec+构造时,
{}
必须是命令的最后一个参数。这就是为什么一些版本的
cp
附带了
-t
选项:
find dir-type f-exec cp-t dest{}+
。请参见:只有包含两个字符“{}”的参数后面的加号才能标点主表达式的结尾。加号的其他用法不应视为特殊用法。谢谢,但我知道这一点。我对环球旅行很感兴趣。@gniourf\u gniourf:谢谢你的评论,我学到了一些新东西