Какой недостающий аргумент для -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
без дополнительных опций и т. д., поскольку они могут понять, когда дано несколько имен файлов. +
также может быть необходимо избежать (т.е. \+
)