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

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

Часть поиска работает, но не 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

Что я делаю неправильно?

Ответ 1

Фактически вы отправляете rm вывод на вход find. Вы хотите использовать вывод find как arguments в 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 не ожидает имени файла на стандартном входе. То, что вы сейчас делаете, передает их назад.

Ответ 2

find /usr/www/bar/htdocs -mtime +15 -exec rm {} \;

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

Ответ 3

Другим более простым способом является использование команды locate. Используйте его xargs.

Например,

locate file.txt | xargs rm
locate *something* | xargs rm

Ответ 4

Предполагая, что вы не находитесь в каталоге, содержащем резервные файлы *.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 {} \;