通过ssh执行脚本时,无法使用命令`date`或`find`

时间:2014-02-01 14:56:32

标签: linux bash ssh

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

使用以下命令登录网络服务器时,我几乎这样做

php

有一个小问题,find命令返回文件的完整路径,因此for I in `sudo find /path/to/web/root -type f \( -name "*.*~1~" \)` ; do sudo mv $I ~/$I`date +%Y%m%d` ; done 在mv中使用后需要截断,但这是另一个问题,超出了这个问题的范围

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

$I

find: command not found

为了解决有关date: command not found不适合迭代的输出的问题,我对此进行了快速测试

find

2 个答案:

答案 0 :(得分:1)

永远不要使用这种语法:

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

有关详细信息,请参阅此reminder

否则,您不必使用循环对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

答案 1 :(得分:0)

可能是您为远程主机设置的用户设置的环境非常少。由于某种原因,可能无法设置PATH。

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

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

我认为如果在这里缺少PATH,那么'mv'也不会被发现。