Я использую следующую команду, чтобы очистить каталог от файлов и каталогов старше 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
Для правильного использования +
флага аргумент для обработки должен быть в конце команды, а не в середине. Вот почему find
trows missing argument to '-exec'
в вашем примере; он пропускает закрывающий {}
.
решение2
Пользователь объяснил свою правку....
...с использованиемэта ссылка. Я думаю, что в основном вместо использования нескольких команд, он отправляет все имена файлов в один экземпляр команды, чтобы ускорить процесс. Вот пример изздесь:
Использование -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
без дополнительных опций и т. д., поскольку они могут понимать, когда задано несколько имен файлов. Их +
также может потребоваться экранировать (т. е \+
. )