Почему опция find -exe c включает элементы, которые не совпадают? - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь использовать find, чтобы найти и исключить / отфильтровать несколько каталогов от копирования в другой каталог резервных копий. Мои попытки сделать это с помощью параметра find '-exe c' закончились копированием каждого обработанного файла, а не только совпадений, поэтому я весьма озадачен тем, каким должно быть ожидаемое поведение, и был бы признателен за помощь в получении лучшего понимания.

Начальная точка:

me@computer>ls
AddMonitorsOnEntry  MantisCoreFormatting  MantisGraph  PastePicture  XmlImportExport

Убедитесь, что find исключает нежелательные «файлы», как ожидалось

me@computer>find . -maxdepth 1 -not -regex '.*MantisCoreFormatting\|.*MantisGraph\|.*XmlImportExport'
.
./AddMonitorsOnEntry
./PastePicture

Теперь скопируйте эти 2 каталоги в резервный каталог:

me@computer>find . -maxdepth 1 -not -regex '.*MantisCoreFormatting\|.*MantisGraph\|.*XmlImportExport' -exec cp -dr '{}' ~/backup \;

Теперь посмотрим, сработало ли это ...

me@computer>cd ~/backup
me@computer>ls
AddMonitorsOnEntry  backup  MantisCoreFormatting  MantisGraph  PastePicture  XmlImportExport

WTH ?? Я думал, что '-exe c' работает только на совпадениях, согласно этому фрагменту со страницы руководства: "... Указанная команда запускается один раз для каждого сопоставленного файла ..."

Я знаю Есть и другие способы выполнить sh эту задачу, но '-exe c', кажется, достаточно хорошо подходит для постера https://unix.stackexchange.com/questions/50612/how-to-combine-2-name-conditions-in-find/50633. Я ищу помощи, чтобы понять, , как использовать "-exe c" вместо использования xargs или чего-то еще . Спасибо.

Ответы [ 2 ]

4 голосов
/ 29 января 2020

Теперь, чтобы скопировать эти 2 каталога в резервный каталог

У вас нет 2 совпадений. Ваша команда показывает 3:

  1. .
  2. ./AddMonitorsOnEntry
  3. ./PastePicture

. является текущим каталог, поэтому ваша команда cp копирует все.

Вместо find . вы можете использовать find *, чтобы пропустить текущий каталог ., но по-прежнему обрабатывать все (не скрытые) файлы / каталоги внутри него.

0 голосов
/ 29 января 2020

Silly of me ..

Мое начальное выражение поиска включает в себя текущий каталог, поэтому любые файлы в текущем каталоге будут обрабатываться "-exe c".

Чтобы исправить, я добавил текущий каталог среди исключенных.

me@computer>find . -maxdepth 1 -not -regex '.*MantisCoreFormatting\|.*MantisGraph\|.*XmlImportExport\|\.'
./AddMonitorsOnEntry
./PastePicture
...