Командная строка: поиск результатов в rm

Я пытаюсь разработать команду, которая удаляет файлы sql старше 15 дней.

Часть find работает, но не rm.

rm -f | find -L /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups -type f  \( -name '*.sql' \) -mtime +15

Выдает список файлов, которые я хочу удалить, но не удаляет их. Пути верны.

usage: rm [-f | -i] [-dIPRrvW] file ...
       unlink file
/usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/20120601.backup.sql
...
/usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/20120610.backup.sql

Что я делаю не так?

105 голосов | спросил jerrygarciuh 25 J0000006Europe/Moscow 2012, 18:40:53

4 ответа


0

Вы фактически отправляете rm вывод на вход find. Вы хотите использовать выходные данные find в качестве аргументов для rm:

find -type f -name '*.sql' -mtime +15 | xargs rm

xargs - это команда, которая «преобразует» свой стандартный ввод в аргументы другой программы или, как они более точно указывают, man,

  

создавать и выполнять командные строки из стандартного ввода

Обратите внимание, что если имена файлов могут содержать пробельные символы, вы должны исправить это:

find -type f -name '*.sql' -mtime +15 -print0 | xargs -0 rm

Но на самом деле find имеет ярлык для этого: -delete опция:

find -type f -name '*.sql' -mtime +15 -delete

Обратите внимание на следующие предупреждения в man find:

  Warnings:  Don't  forget that the find command line is evaluated
  as an expression, so putting -delete first will make find try to
  delete everything below the starting points you specified.  When
  testing a find command line that you later intend  to  use  with
  -delete,  you should explicitly specify -depth in order to avoid
  later surprises.  Because -delete  implies  -depth,  you  cannot
  usefully use -prune and -delete together.

P.S. Обратите внимание, что передача напрямую в rm не вариант, потому что rm не ожидает имен файлов при стандартном вводе. То, что вы в настоящее время делаете, это обматывает их в обратном направлении.

ответил Lev Levitsky 25 J0000006Europe/Moscow 2012, 19:03:04
0
find /usr/www/bar/htdocs -mtime +15 -exec rm {} \;

Выберет файлы в /usr/www/bar/htdocs старше 15 дней и удалит их.

ответил Suresh 30 PM00000020000002831 2013, 14:57:28
0

Еще один более простой способ - использовать команду locate. Затем перенаправьте результат в xargs.

Например,

locate file | xargs rm
ответил Gautam 27 PMpThu, 27 Apr 2017 16:23:36 +030023Thursday 2017, 16:23:36
0

Если вы не находитесь в каталоге, содержащем файлы резервных копий * .sql:

find /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/*.sql -mtime +15 -exec rm -v {} \;

Опция -v, приведенная выше, удобна, она будет подробно выводить, какие файлы удаляются по мере их удаления.

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

find /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/*.sql -mtime +15 -exec ls -lrth {} \;
ответил Nick Little 6 J0000006Europe/Moscow 2017, 06:07:49

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132