编辑和更改措辞以使其更加清晰 - 我在 dirA 和 dirB 中都有 .dm4 文件。我的参考文件夹是 dirA,我想列出 dirA 中缺少的所有 .dm4 文件,这些文件位于 dirB 中,然后将所有缺少的 .dm4s 以及目录 A 的现有 .dm4s 一起发布到目录 C 中,从而确保我不会错过任何可能存在于我的 dirA 和 dirB 中的 .dm4s。
答案1
让我们做出一些假设:
- 你的外壳是
bash
- 你的目录A是
dirA
- 你的目录B是
dirB
- 你的目录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 文件dirA
是elderberry
、grape
和huckleberry
。找到的所有文件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
仅检查文件名,要检查版本,-u
pdate 选项可能会很有趣。