如何复制部分而非全部文件?


54

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

Answers:


42

bash你可以使用extglob

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

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

您以后可以extglob使用禁用

 $ shopt -u extglob

您知道tcsh shell是否有等效功能吗?
勒冯·2012年

不幸的是我没有。似乎find是唯一的方法tcshfind . -maxdepth 1 ! -name "exclude*" -exec cp -t destination {} \+
匆匆忙忙

50

Rsync处理得很好。

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

复制所有示例,但不包括: rsync -aP --exclude=x /folder1/* /folder2/

-aP开关:

a:类似于cp -a,递归等。P:显示进度,这是rsync的一个不错的功能。


5
并参阅此答案以获取常见rsync排除列表的简短指南。
吉尔(Gilles)'所以

1
在darwin / MacOS上,如果要递归,请使用-rP代替-aP-a用于存档。不确定是否已更改或在MacOS上是否有所不同。
jpoveda

rsync确实可以选择使其递归。范例:rsync --recursive -P --exclude=x /folder1/* /folder2/。(仅在Ubuntu上测试)
n1k31t4 '18年

12

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

$ cp ^x /path/to/destination

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

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

cp *.wav~*xyz*

bash什么意见吗?
乍得哈里森2012年

@hydroparadise我对bash不太了解,但是这个答案似乎涵盖了它
Michael Mrozek

那tcsh呢?有人知道吗
Levon 2012年

4

与使用高级shell globbing或带有内置排除选项的命令相比,也可以使用标准工具以多种方式在普通的(便携式/兼容)bourne shell中完成操作,而方式却不那么优雅。

如果文件太多(并且没有包含空格和/或换行符的名称),则可以采用以下方法:

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

当然,bashGNU工具既强大又强大,但仍不总是可用。如果您打算将其放在可移植脚本中,我将建议find使用Rush的评论。


2
我发现您答案的最后一部分只会分散您的注意力。此外,“ Unix”不再是黄金标准(如果有的话)。尽管这个站点的名称是“ Unix and Linux”,但是否是“ Unix”还是不再相关。
亚历山大

2
好。我将评论移到了这里:Unix不是GNU。我同意事物的“统一性”不是很有趣,但是我仍然相信可移植性并且对您的历史有所了解。
MattBianco 2012年

完全同意您的意见。
2012年

2

如果要将文件夹(包括子文件夹)中的所有内容复制到特定的子目录:

cp -R $(ls | grep -v '^subdir$') subdir/

适用于sh,bash,zsh(至少)。


1
说服我,这与cp -R * subdir/
roaima意向书

1
如果使用该命令“ cp -R * subdir /”,则bash / zsh尝试递归复制“ subdir”。您最终得到一个错误:“名称太长(未复制)”。
user2707671 2015年

好点子。您的建议试图避免来自cp(不是来自bash/ sh)“ cp: cannot copy a directory, ‘subdir’, into itself, ‘subdir/subdir’” 的警告。但是,副本确实可以正确完成。不幸的是,您的变体会破坏任何包含空格或对shell敏感的标点符号的文件名。参见unix.stackexchange.com/q/128985/135943
roaima 2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.