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

Joe*_*tti 92 bash scripting copy

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

Jon*_*Jon 132

应如下:

cp -r !(Default.png) /dest
Run Code Online (Sandbox Code Playgroud)

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

cp -r !(Default.png|example) /example
Run Code Online (Sandbox Code Playgroud)

  • 这需要`shopt -s extglob`才能工作,如果已被禁用. (43认同)
  • 这会产生-bash:!:找不到事件 (16认同)
  • 似乎OS X需要使用@BarryKelly描述的`shopt -s extglob`.有了它,它完美地运作. (5认同)
  • 使用 Bash 多年,但不知道`!()`...漂亮!对于那些像我一样觉得是时候学习/回顾 [bash](https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html) 的人,这里是相关的与此问题/答案相关的链接:[shopt/extglob](https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html)和[模式](https:// www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html#Pattern-Matching)。 (2认同)

mat*_*tja 65

rsync已经成为我的cp/scp替代品很长一段时间了:

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

-a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
-v, --verbose               increase verbosity
Run Code Online (Sandbox Code Playgroud)


Joh*_*ica 48

简单,如果src/只包含文件:

find src/ ! -name Default.png -exec cp -t dest/ {} +
Run Code Online (Sandbox Code Playgroud)

如果src/有子目录,这会省略它们,但会复制它们内部的文件:

find src/ -type f ! -name Default.png -exec cp -t dest/ {} +
Run Code Online (Sandbox Code Playgroud)

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

find src/ -type f -maxdepth 1 ! -name Default.png -exec cp -t dest/ {} +
Run Code Online (Sandbox Code Playgroud)

  • @Max` \;`每个文件执行一次命令.`+`运行一次命令并立即将所有文件名传递给它(受命令行长度限制).`+`一般来说效率更高一些. (6认同)
  • 这对我来说是最好的,因为看起来OS X在没有启用glob的情况下发布. (4认同)