命令行:pipe道findrm的结果
我试图找出一个删除超过15天的SQL文件的命令。
find部分是工作,但不是公司。
rm -f | find -L /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups -type f \( -name '*.sql' \) -mtime +15
它列出了我想删除的文件,但不删除它们。 path是正确的。
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
我究竟做错了什么?
你实际上将rm
的输出输出到find
的input。 你想要的是使用find
的输出作为rm
参数 :
find -type f -name '*.sql' -mtime +15 | xargs rm
xargs
是将其标准input“转换”为另一个程序的参数的命令,或者,因为它们更准确地将其放在man
页上,
从标准input构build和执行命令行
请注意,如果文件名可以包含空格字符,则应该更正这一点:
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.
PS请注意,直接连接到rm
不是一种select,因为rm
不会在标准input上预期文件名。 你现在正在做的是把它们倒过来。
find /usr/www/bar/htdocs -mtime +15 -exec rm {} \;
将select超过15天的/usr/www/bar/htdocs
文件并删除它们。
另一个更简单的方法是使用locate
命令。 使用它xargs
。
例如,
locate file.txt | xargs rm locate *something* | xargs rm
假设您不在包含* .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 {} \;