it-swarm.com.ru

Командная строка: поиск результатов поиска в 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

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

111
jerrygarciuh

Вы на самом деле отправляете rm's output на вход 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.

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

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

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

23
Suresh

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

Например,

locate file | xargs rm
2
Gautam

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