如何获取find和mv集成命令的日志?

如何获取find和mv集成命令的日志?

我在脚本中使用此命令来查找特定文件并移动到不同的文件夹;但是,我需要生成我移动的文件的日志。

find $1* -prune -name "*.$2" -mtime +$3 -exec mv {} $4 \;

要在该命令中添加什么才能生成日志?

答案1

你的命令,

find $1* -prune -name "*.$2" -mtime +$3 -exec mv {} $4 \;

首先应该写成

find "$1"* -prune -name "*.$2" -mtime +"$3" -exec mv {} "$4" \;

否则,您将取消其在名称中包含空格的目录和文件上使用的资格。

要输出此命令中实际移动的事物的路径名mv,只需添加-print最后一个:

find "$1"* -prune -name "*.$2" -mtime +"$3" -exec mv {} "$4" \; -print

这将输出已成功移动到 给定目标的所有文件(或目录)的路径名"$4"

答案2

您可以在 -exec 之前添加 -print 以在移动之前打印文件名。

答案3

您可以-exec使用命令添加另一个块echo来写入日志文件,即

find $1* -prune -name "*.$2" -mtime +$3 -exec mv {} $4 \; -exec echo mv {} $4 >> /path/to/log \;

如果你想要更少的信息,只需修改最后的-exec块,例如-exec echo {} >> /path/to/log \;

错误记录

如果您还想记录命令是否成功,您还可以将标准错误从mv命令传输到日志文件。我认为不能保证第一个-exec一定先起作用,所以-exec在这种情况下我会使用一个。注意,这里的语法有点复杂。

find $1* -prune -name "*.$2" -mtime +$3 -exec mv {} $4 \; -exec sh -c 'echo mv $1 $2 >> /path/to/log; mv $1 $2 2>> /path/to/log' . {} $4 \;

一些评论

我不确定您的确切用例,但引用您的变量是一个很好的做法,例如find "$1"* …,以防文件名带有空格/等。在他们中。

其次,-execdir优先于-exec。从man find

使用 -exec 操作存在不可避免的安全问题;您应该使用 -execdir 选项。

mv -v 代替

或者,根据 Steeldriver 的评论,如果您的版本mv支持详细-v选项,您可以修改原始-exec块,以

-exec mv -v {} $4 >> /path/to/log \;

这将提供类似于 的输出renamed 'foo' -> 'bar'

相关内容