Какой недостающий аргумент для -exec?

Я использую следующую команду, чтобы очистить каталог от файлов и каталогов старше 30 дней и переместить их в архивный каталог, который я могу удалить через несколько недель, если никто не попросит вернуть их файлы. Целевой каталог имеет подкаталоги по имени пользователя, как и каталог архива.

Это команда, которую я использую:

find /path/to/directory/username/ -mtime +30 -exec mv "{}" /path/to/archive/username/ \;

Я предложил модифицированную версию этого, чтобы ответить на вопрос о Ubuntu, другой пользователь отредактировал код, чтобы изменить конец строки \; за + как быстрее (и правильнее?). Посмотреть здесь

Однако, используя + таким образом работает, если -exec команда ls -lh но не в реальной команде, которую я использую. Если я попробую это с + Я получаю сообщение об ошибке:

find: missing argument to '-exec'

Я не понимаю, почему он так себя ведет, или какой будет правильная команда. Пожалуйста, не просто публикуйте исправление команды, я хотел бы понять, а не просто слепо следовать предложению.

2 ответа

Решение

Пользователь в этом посте может сказать, что + подписать в конце -exec Команда быстрее, но не почему.

Давайте предположим, что find Команда возвращает следующие файлы:

/path/to/file1
/path/to/file2
/path/to/file3

Нормальный -exec команда (-exec command {} \;) запускается один раз для каждого соответствующего файла. Например:

find ... -exec mv {} /target/ \;

Исполняет:

mv /path/to/file1 /target/
mv /path/to/file2 /target/
mv /path/to/file3 /target/

Если вы используете + знак (-exec command {} +) команда строится путем добавления нескольких совпадающих файлов в конце команды. Например:

find ... -exec mv -t /target/ {} +

Исполняет:

mv -t /target/ /path/to/file1 /path/to/file2 /path/to/file3

Чтобы использовать + флаг правильно аргумент для обработки должен быть в конце команды, а не в середине. Вот почему find trows missing argument to '-exec' в вашем примере; это пропускает закрытие {},

Пользователь объяснил их редактирование....

... используя эту ссылку. Я думаю, что в основном вместо использования нескольких команд он отправляет все имена файлов одному экземпляру команды, чтобы ускорить процесс. Вот пример отсюда:

Использование -exec с точкой с запятой (find . -exec ls '{}' \;), выполню

ls file1
ls file2
ls file3

Но если вы используете вместо этого знак плюс (find . -exec ls '{}' \+), все имена файлов будут переданы в качестве аргументов одной команде:

ls file1 file2 file3

Есть другие формы, доступные с помощью ; а также + как хорошо ( отсюда:)

Поэтому синтаксис следующего примера разрешен для команды find:

find . -exec echo {} \;
find . -exec echo {} ';'
find . -exec echo {} ";"
find . -exec echo {} \+
find . -exec echo {} +

ОДНАКО, я не уверен, что это все равно будет работать с командой перемещения, так как ее синтаксис mv [OPTION]... SOURCE DEST, если только -t вариант или аналог используется. Однако это должно работать с ls без дополнительных опций и т. д., поскольку они могут понять, когда дано несколько имен файлов. + также может быть необходимо избежать (т.е. \+)

Другие вопросы по тегам