通过SSH执行脚本时,不能使用命令`date'或`find'



我已经构建了一个用于将补丁应用于服务器的脚本。它运行良好(ISH),并使用--backup=t语法对其覆盖的任何文件进行备份。现在,我需要移动这些备份,因为它们不再结束.php,而是结束.php.~1~,这意味着如果您通过Web浏览器查看文件,则会获得php脚本的纯文本输出

我可以使用以下命令

登录到Web服务器时几乎
for I in `sudo find /path/to/web/root -type f ( -name "*.*~1~" )` ; do sudo mv $I ~/$I`date +%Y%m%d` ; done

有一个微小的问题是,查找命令返回文件的全部路径,因此$I在MV中使用后需要截断,但这是另一个问题,并且在此问题的范围之外

我遇到的问题是,当我尝试远程执行此命令时,我会收到以下错误

find: command not found

date: command not found

解决有关find输出的问题,不适合迭代,我敲了这个快速测试

findtest lukes$ ls web
1   1.~1~   2   2.~1~   3   4   6   6.~1~   7   8   9
findtest lukes$ for I in `sudo find web -type f ( -name "*.*~1~" )` ; do sudo mv $I $I`date +%Y%m%d` ; done
findtest lukes$ ls web
1       2       3       6       7       9
1.~1~20140201   2.~1~20140201   4       6.~1~20140201   8

永远不要使用此语法:

for var in in `cmd`; do ... ; done
for var in in $(cmd); do ... ; done

有关更多详细信息,请参见此提醒。

否则,您不必使用循环来执行find返回的每个项目。

find [...] -exec [commands] {} ;

这是一个示例:

find /home/yourdir -name "*.txt" -exec cat {} ;

它比:

好得多
for i in $(find /home/yourdir -name "*.txt"); do cat $i; done

最后,您能给我们以下变量的内容吗?

echo $PATH
echo $SHELL

可能是,对于您所在的远程主机的用户,几乎没有很少的环境。由于某种原因,可能无法设置路径。

尝试使用完整的路径查找和日期:

for I in `sudo /bin/find /path/to/web/root -type f ( -name "*.*~1~" )` ; do sudo mv $I ~/$I`/bin/date +%Y%m%d` ; done

我以为如果在这里丢失路径,也不会找到" MV"。

相关内容

  • 没有找到相关文章

最新更新