我正在尝试编写一个删除超过15天的sql文件的命令。
查找部分正在运行但不是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
我做错了什么?
答案 0 :(得分:232)
您实际上是将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
不期望标准输入上的文件名。你目前正在做的是向后管道。
答案 1 :(得分:24)
find /usr/www/bar/htdocs -mtime +15 -exec rm {} \;
将选择超过15天的/usr/www/bar/htdocs
中的文件并将其删除。
答案 2 :(得分:2)
另一种更简单的方法是使用locate
命令。然后,将结果传递给xargs
。
例如,
locate file | xargs rm
答案 3 :(得分:0)
假设您不在包含* .sql备份文件的目录中:
find /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/*.sql -mtime +15 -exec rm -v {} \;
上面的-v选项很方便,它会详细输出哪些文件在删除时被删除。
我想首先列出要删除的文件以确定。 E.g:
find /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/*.sql -mtime +15 -exec ls -lrth {} \;
答案 4 :(得分:0)
使用 xargs 传递参数,使用选项 -rd '\n' 忽略名称中的空格:
<块引用>"${command}" | xargs -rd '\n' rm
如果您还想删除只读文件,请包括 --force。