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