如何复制部分但不是全部文件?

如何复制部分但不是全部文件?

因此,在目录上下文中*使用时,您可以将 用作所有文件的通配符。cp有没有办法复制除x文件之外的所有文件?

答案1

Rsync 很好地处理了这个问题。

全部复制示例:rsync -aP /folder1/* /folder/2

复制全部并排除的示例:rsync -aP --exclude=x /folder1/* /folder2/

开关-aP

  • a:类似于cp -a、递归等。
  • P:显示进度,rsync 的一个很好的功能。

答案2

bash你可以使用extglob

 $ shopt -s extglob  # to enable extglob
 $ cp !(b*) new_dir/

其中!(b*)排除所有b*文件。

您可以稍后extglob禁用

 $ shopt -u extglob

答案3

这不是 的功能cp,而是 shell 的功能(它将 扩展*为所有非点文件),因此答案取决于您使用的 shell。例如,zsh支持这种语法:

$ cp ^x /path/to/destination

其中表示“除”^x之外的所有文件x

您还可以组合选择和取消选择模式,例如要复制除包含 xyz 的文件之外的所有 wav 文件,您可以使用:

cp *.wav~*xyz*

答案4

也可以使用标准工具以多种方式在普通旧(可移植/兼容)bourne shell 中完成,但与使用高级 shell 通配符或具有内置排除选项的命令相比,其方式要差得多。

如果文件不是太多(并且名称不包含空格和/或换行符),这可能是一种方法:

cp `ls | egrep -v '^excludename$'` destdir/.

当然,bashGNU 工具很棒而且功能强大,但它们仍然并不总是可用。如果您打算将其放入可移植脚本中,我会find像 Rush 的评论中那样推荐。

相关内容