Редактирование и изменение формулировок для большей ясности - У меня есть файлы .dm4 в dirA и dirB. Моя справочная папка — dirA, и я хочу перечислить все файлы .dm4, отсутствующие в dirA, которые есть в dirB, а затем разместить все отсутствующие файлы .dm4 и вместе с существующими файлами .dm4 из dir A в каталоге C, таким образом убедившись, что я не упущу ни одного файла .dm4, который может существовать в моих dirA и dirB.
решение1
Давайте выдвинем несколько предположений:
- Ваша оболочка
bash
- ТвойКаталог Аявляется
dirA
- ТвойКаталог Бявляется
dirB
- ТвойКаталог Спока не существует, но будет назван
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.