我已经构建了一个用于将补丁应用于服务器的脚本。它运行良好(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"。