BASH复制除一个文件外的所有文件


110

除了一个名为Default.png的文件,我想从一个目录中复制所有文件。似乎有很多方法可以做到这一点。对您来说最有效的是什么?


为什么您需要它跳过该文件,而不是在复制后将其删除?它已经存在于目标目录中了吗?
Lasse V. Karlsen

1
是的,目标目录中已经存在同名文件。
乔坎纳蒂09年

@ LasseV.Karlsen:或者,如果文件很大,则可以节省复制时间。我对此感兴趣,但排除了目录而不是文件。
Nikana Reklawyks 2012年

Answers:


54

简单(如果src/仅包含文件):

find src/ ! -name Default.png -exec cp -t dest/ {} +

如果src/具有子目录,则将其忽略,但会在其中复制文件:

find src/ -type f ! -name Default.png -exec cp -t dest/ {} +

如果src/具有子目录,则不会递归到它们:

find src/ -type f -maxdepth 1 ! -name Default.png -exec cp -t dest/ {} +

5
事实证明,这对我来说是最好的,因为OS X出厂时似乎未启用glob。
2009年

6
@Max \;每个文件执行一次命令。+运行一次命令,然后一次将所有文件名传递给它(受命令行长度限制)。+一般而言,效率更高。
John Kugelman 2014年

149

应该如下:

cp -r !(Default.png) /dest

如果复制到嵌套在当前文件夹中的文件夹(在以下情况下称为示例),则还需要省略该目录:

cp -r !(Default.png|example) /example

17
这会产生-bash:!:未找到事件
Joe Cannatti 09年

您是否将文件复制到要复制的文件夹中嵌套的文件夹中?
乔恩

47
shopt -s extglob如果它已被禁用,则需要工作。
巴里·凯利

5
似乎OS X需要shopt -s extglob按照@BarryKelly所述使用。这样,它可以完美地工作。
2014年

多年在Bash上,不知道!()...美丽!对于那些像我一样觉得是时候学习/复习bash的人,这里是与此问题/答案相关的相关链接:shopt / extglobpattern
布兰特

73

rsync很长时间以来一直是我的cp / scp替代品:

rsync -av from/ to/ --exclude=Default.png

-a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
-v, --verbose               increase verbosity

如果要排除两个不同的文件,该如何使用?
Pulkit Bansal

支持多个--exclude =参数。-r如果您要同步目录,请不要忘记arg
Rian Sanderson

5

我会做:

cp srcdir/* destdir/ ; rm destdir/Default.png

除非文件很大。否则使用例如

find srcdir -type f/ |grep -v Default.png$ |xargs -ILIST cp LIST destdir/

1
第一条命令不是OP要求的。如果Default.png在这两个目录存在,它将取代在一个destdir由一个在srcdir,然后删除复制Default.png。相反,OP希望保留Default.png中已经存在的destdir
SnowFrog

2
destdir中已经存在default.png呢?您的解决方案将无法正常工作。
伊曼·穆罕默迪

2

这对于复制除节点模块以外的所有内容非常有用:)享受,并感谢我刚刚添加的上面的答案。在我看来,Rsync比CP更好,因为您无需查看即可看到进度条。

   rsync -av fromDirectory/ ToDirectory/ --exclude=node_modules



-2

与正则表达式一起使用外壳的扩展参数

cp /<path>/[^not_to_copy_file]* .

除not_to_copy_file以外的所有内容都将被复制

-如果这有什么问题。请明确说明 !


1
欢迎来到SO。不幸的是,您的答案不正确。方括号表示([...])包含一组要匹配的字符,而前导^将导致所列出字符的补码匹配。在以下示例中,将不会列出任何文件:touch not_to_copy_file to_copy_file ; ls [^not_to_copy_file]*因为将排除以下任何字符开头的所有文件名:_cefilnopty
rtx13
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.