比较两个目录中的某个扩展名,然后将缺少的扩展名移动到新目录

比较两个目录中的某个扩展名,然后将缺少的扩展名移动到新目录

编辑和更改措辞以使其更加清晰 - 我在 dirA 和 dirB 中都有 .dm4 文件。我的参考文件夹是 dirA,我想列出 dirA 中缺少的所有 .dm4 文件,这些文件位于 dirB 中,然后将所有缺少的 .dm4s 以及目录 A 的现有 .dm4s 一起发布到目录 C 中,从而确保我不会错过任何可能存在于我的 dirA 和 dirB 中的 .dm4s。

答案1

让我们做出一些假设:

  • 你的外壳是bash
  • 你的目录AdirA
  • 你的目录BdirB
  • 你的目录C尚不存在,但将被命名dirC
  • 您关心的所有文件都存在于这些目录中,dirA或者dirB可能在这些目录中重复

我能想到的最简单的方法是:

rm -rf dirC; mkdir dirC
cp -p dirB/*.dm4 dirC/
cp -p dirA/*.dm4 dirC/
diff <(ls dirA) <(ls dirB)

这会将所有 .dm4 文件放入dirC并生成diff两个目录的列表。

如果您需要比这更详细的信息,请编辑你的问题更具体。

更新:

假设您有这些文件:

$ ls -1 dir{A,B}/*
dirA/apple.dm4
dirA/banana.dm4
dirA/date.dm4
dirA/fig.dm4
dirB/apple.dm4
dirB/elderberry.dm4
dirB/fig.dm4
dirB/grape.dm4
dirB/huckleberry.dm4

请注意,有些文件是重复的,有些文件仅在 中dirA,有些文件仅在dirB.cherry.dm4就其价值而言,两个目录都没有文件。

还假设您有一个脚本 foo.sh:

$ cat << EOF > foo.sh; chmod 755 foo.sh
#!/usr/bin/env bash
rm -rf dirC; mkdir dirC
cp -p dirB/*.dm4 dirC/
cp -p dirA/*.dm4 dirC/
diff <(ls dirA) <(ls dirB)
EOF

运行foo.sh产生:

$ ./foo.sh
2,3c2
< banana.dm4
< date.dm4
---
> elderberry.dm4
4a4,5
> grape.dm4
> huckleberry.dm4
$ ls -1 dirC/*
dirC/apple.dm4
dirC/banana.dm4
dirC/date.dm4
dirC/elderberry.dm4
dirC/fig.dm4
dirC/grape.dm4
dirC/huckleberry.dm4

输出diff告诉您缺少的 .dm4 文件dirAelderberrygrapehuckleberry。找到的所有文件dirA 或者 dirB存在于dirC

答案2

将dirA的所有文件复制到dirC

cp dirA/*.dm4 dirC

然后从 dirB 复制所有文件,跳过 dirC 中的现有文件

cp -n dirB/*.dm4 dirC/

手册页cp

  -n, --no-clobber
         do not overwrite an existing file (overrides a previous -i
          option)

注意:-n仅检查文件名,要检查版本,-update 选项可能会很有趣。

相关内容