Я использую следующую команду, чтобы очистить каталог от файлов и каталогов старше 30 дней и переместить их в архивный каталог, который я могу удалить через несколько недель, если никто не попросит вернуть их файлы. Целевой каталог имеет подкаталоги по имени пользователя, как и каталог архива.
Это команда, которую я использую:
find /path/to/directory/username/ -mtime +30 -exec mv "{}" /path/to/archive/username/ \;
Я предложил модифицированную версию этого , чтобы ответить на вопрос о том, спросить убунт, другой пользователь редактирует код , чтобы изменить конец строки \;
для , +
как это быстрее (и правильнее?). Посмотреть здесь
Тем не менее, использование +
таким образом работает, если -exec
команда, ls -lh
но не в фактической команде, которую я использую. Если я попробую это сделать, +
я получу сообщение об ошибке:
find: missing argument to '-exec'
Я не понимаю, почему он так себя ведет, или какой будет правильная команда. Пожалуйста, не просто публикуйте исправление команды, я хотел бы понять, а не просто слепо следовать предложению.
источник
+
предоставляет несколько аргументов для одной и той же команды, ноmv
не может справиться с этим!Ответы:
Пользователь в этом посте может сказать, что
+
знак в конце-exec
команды быстрее, но не почему.Предположим,
find
команда вернула следующие файлы:Обычная
-exec
команда (-exec command {} \;
) запускается один раз для каждого соответствующего файла. Например:Выполняет:
Если вы используете
+
знак (-exec command {} +
), команда собирается путем добавления нескольких совпадающих файлов в конце команды. Например:Выполняет:
Чтобы
+
правильно использовать флаг, аргумент для обработки должен находиться в конце команды, а не в середине. Вот почемуfind
Троуmissing argument to '-exec'
в вашем примере; это пропускает закрытие{}
.источник
find -exec
требуется{}
последний аргумент, когда используется с+
. Кто-нибудь знает, почему было принято это проектное решение, вместо того, чтобы позволить конструкциям, подобным командной строке OP, работать?Пользователь объяснил их редактирование ....
... используя эту ссылку . Я думаю, что в основном вместо использования нескольких команд он отправляет все имена файлов одному экземпляру команды, чтобы ускорить процесс. Вот пример отсюда :
Есть и другие формы, доступные с использованием
;
и+
также ( отсюда :)Поэтому синтаксис следующего примера разрешен для команды find:
ОДНАКО, я не уверен, что это все равно будет работать с командой перемещения, так как это синтаксис
mv [OPTION]... SOURCE DEST
, если только не используется-t
опция или подобное. Однако он должен работатьls
без лишних опций и т. Д., Поскольку они могут понять, когда задано несколько имен файлов.+
Также нужно экранировать (то есть\+
)источник
mv -t
, хотя оба + 1!