0

我正在尝试将文件从一个地方移动到另一个目录......所以我的程序将读取 Log_Deleter,使用每行中给出的参数来删除文件。当我执行文件时,它似乎运行良好(没有错误)但没有文件被移动......我不确定为什么它没有移动文件也没有显示任何错误......有人可以识别错误吗?

我的尝试:

#!/bin/ksh

while read -r line ; do
    v=$line
    set -- $v
    cd /
    $(find "$1" -type f -name "$2" -mtime +"$3" -exec mv {} "$4" \;)
done < Log_Deleter.txt

Log_Deleter.txt

/usr/IBM/WebSphere/AppServer/profiles/AppSrvSIT1/logs/Server1 'SystemOut_*' 5 /backup/Abackuptest1
/usr/IBM/WebSphere/AppServer/profiles/AppSrvSIT1/logs/Server2 'SystemOut_*' 5 /backup/Abackuptest2

谢谢你的帮助!

4

2 回答 2

1

Find 正在查找名称中包含文字的文件'$2您需要在调用 find 之前删除单引号。尝试:

#!/bin/ksh

while read -r path name mtime dest ; do
    name=$( echo $name | tr -d "'" )
    find "$path" -type f -name "$name" -mtime +"$mtime" -exec mv {} "$dest" \;
done < Log_Deleter.txt
于 2012-11-01T20:16:12.160 回答
1

问题是您正在尝试匹配名称中实际上包含单引号的文件。

除非有其他问题,我认为一旦您从 Log_Deleter.txt 中取出引号,您的脚本可能会起作用。

引号仅在 shell 解析命令输入时才有意义。这不是read内置函数的作用。即使在读取命令输入时,一旦引号进入变量,它们就会永远留在那里,除非在 shell CLI 层通过重新读取eval.

shell 并不完全是一个宏处理器。这是一个复杂的混合体,包含一点 CLI、一点编程语言和一点宏处理器。

而且,说到 eval,没有必要将 包装find在类似 eval 的构造中。简化你的脚本find直接运行,你会发现它更容易调试和理解。

于 2012-11-01T20:29:50.840 回答