【发布时间】:2021-03-18 05:37:57
【问题描述】:
我不确定这是curl 问题还是我的代码有问题。
我正在使用curl -T 将目录的内容上传到远程服务器,并且由于curl 没有,根据帮助文件和一些谷歌搜索,如果文件存在,我可以跳过它,我正在尝试围绕它编写脚本。
#!/bin/sh
cd /foo/bar
curl --user foo:bar -ls ftp://ftp.server.foo/remote/dir/ > /foo/bar/temp.txt
for file in ./*.dat
do
if ! grep -Fq "$file" temp.txt
then
curl --user foo:bar -T "$file" ftp://ftp.server.foo/remote/dir/
fi
done
rm -f /foo/bar/temp.txt
我目前在/foo/bar 中有 6 个文件,这些文件已经上传到远程。我出于测试目的从远程删除了其中一个文件,但所有 6 个文件都重新传输了。
使用上面的代码,只要与 temp.txt 不匹配,curl 就会上传在for 循环中找到的所有文件,无论它是否匹配if 条件。我是否遗漏了一些非常明显的东西,或者这是 curl 的东西,我在 SuperUser 中过得更好?
【问题讨论】:
-
运行
sh -x your.script.sh时看到了什么?是你greptemp.txt却创建/foo/bar/temp.txt的麻烦吗?嗯;你做cd /foo/bar所以curl命令重定向中的路径是不必要的。您是否查看过/foo/bar/temp.txt以查看其中的内容? -
对于第一个问题,我看到连续的
grep命令,并且对于每个grep,还有一个curl调用。但是,由于您的建议,我现在确实注意到grep命令正在寻找./file1.dat,而不仅仅是file1.dat- 我将尝试简单地执行for file in *.dat并更新您的结果。对于第二个问题,temp.txt文件包含.、..、file1.dat、file2.dat、file3.dat等。 -
所以现在你知道为什么
grep没有在temp.txt中找到它正在寻找的名称(文件、字符串),因此它失败并且循环中的curl命令是为每个文件执行。