Какой аргумент отсутствует в -exec?

Какой аргумент отсутствует в -exec?

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

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

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

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

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

find: missing argument to '-exec'

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

решение1

Пользователь в этом посте, возможно, сказал, что +знак в конце команды -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

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

решение2

Пользователь объяснил свою правку....

Терминатор exec '+' быстрее, чем '\;' см. https://askubuntu.com/questions/558817/what-is-the-difference-between-using-and-in-exec-command; и создание файла резервной копии из исходного файла — хорошая идея

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

Использование -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 {} +

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

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