【问题标题】:Bash: Copy all files with same extension in root/current folder, except those whose filename contains certain stringBash:复制根/当前文件夹中具有相同扩展名的所有文件,但文件名包含特定字符串的文件除外
【发布时间】:2020-09-20 05:53:33
【问题描述】:

我已经构建了用于在一个cp 命令行中复制多个文件夹和文件匹配文件类型的脚本,如下所示:

today=$(date +"%d-%m-%Y");
cp -r ./{dir1,dir2,dir3,..,fi.le1.ext1,*.ext2,*.ext3} "../Target_$today/Subdir_$today/"

现在我想复制“.ext3”的所有文件,但忽略名称中包含“lock”或“-lock”的文件。因为这些文件是自动生成的,所以不需要备份它们(例如 package-lock.json)。

如何在不添加任何 find 语句的情况下做到这一点,而只使用通配符和否定运算符?

【问题讨论】:

  • rsync -a --exclude '*lock*' ....代替cp -r不是更方便吗?
  • GitBash 中没有rsync 之类的命令,正如我在下面的评论中已经说过的并且也在标签中提到的那样,该解决方案也需要在 GitBash 中以相同的方式工作。
  • 老实说,我不知道 GitBash 到底附带了哪些工具,但如果你使用它,就意味着你在 Windows 上运行。您是否考虑过安装 Cygwin,它为您提供了“常用”工具的全部选择?
  • 我只需要使用 GitBash,因为它已经安装了,而且我所说的系统是办公系统,我无权删除或安装新应用程序,除了 GitBash 是如今被广泛使用,而 Cygwin 正在慢慢过时..
  • 我明白了。但仅供参考(以防有一天您需要它):您也可以在本地安装 Cygwin,而无需管理员权限(设置中有一个选项)。至于 Cygwin 是否过时,我认为这取决于微软如何改进他们的 Ubuntu 子系统——当然,我也无法预测未来。

标签: bash shell wildcard git-bash cp


【解决方案1】:

使用扩展全局:

shopt -s extglob nullglob

cp -r ./{dir1,dir2,dir3,..,fi.le1.ext1,!(*lock).ext2,*.ext3} "../Target_$today/Subdir_$today/"

【讨论】:

  • 您的回答对于原始 Unix 和 Linux shell 是正确的,但我不确定 git-bash 是否也支持通配符。我希望它在 Windows Git Bash 中也能以同样的方式工作,就像它在 Linux shell 中一样。
  • 抱歉,我没有要在那里测试的 Windows,但这个 extglob 是 bash 功能
  • @VickyDev,如果是 bash,它将适用于任何操作系统。请注意git-bash 拥有最新最好的 bash 版本和 GNU 实用程序。我在我的 windows 机器上安装了git-bash 和后来的Cygwin 来做一些我在类 Unix 环境下会做的琐碎事情,因为我没有费心使用 powershell。
  • @Jetchisel :当你并排运行 git-bash 和 Cygwin 时,没有冲突吗? git-bash 自带的git 和 Cygwin 发行版中的git 有什么优势?
  • 我不会同时使用它们。现在我主要使用 Cygwin。 git-bash 已经有提示设置来显示 repo 的分支
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多