Сравните два каталога для определенного расширения, а затем переместите отсутствующие в новый каталог

Сравните два каталога для определенного расширения, а затем переместите отсутствующие в новый каталог

Редактирование и изменение формулировок для большей ясности - У меня есть файлы .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.

Связанный контент