【问题标题】:How to copy all files within a directory with globstar?如何使用 globstar 复制目录中的所有文件?
【发布时间】:2015-02-23 17:43:33
【问题描述】:

假设我要将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/**/*!(/)

【问题讨论】:

  • “仅文件”是什么意思?您要排除空目录吗?
  • (AFAIK)您不能排除所有具有扩展 glob 的目录。像*!(/) 这样的模式不起作用,!(*/) 挂起 shell。
  • @CommuSoft:我想排除所有目录,就像dir/f* dir/*/*一样。

标签: bash shell pattern-matching glob shopt


【解决方案1】:

一种选择是使用find-type f 选项:

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

【讨论】:

  • 这不起作用。在-exec ... + 构造中,{} 必须是命令的最后一个参数。这就是为什么某些版本的cp 带有-t 选项:find dir - type f -exec cp -t dest {} +
  • 参见POSIX spec只有一个加号跟在包含两个字符“{}”的参数后面才能标出主要表达式的结尾。加号的其他用途不应被视为特殊。
  • 谢谢,但我知道这一点。我对globbing很感兴趣。
  • @gniourf_gniourf:谢谢你们的cmets,我学到了一些新东西
猜你喜欢
  • 2014-10-27
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
  • 2013-08-09
相关资源
最近更新 更多