设置
我有一个简单的1行bash shell脚本。它的目的是找到特定目录中的所有文件。执行每个文件的curl POST ..然后将文件移动到“旧”目录。
当前尝试
下面是我正在使用的find命令..我将把它放在多行上以便于阅读,但它在我的脚本中都是同一行
sudo find . -type f
-exec curl -vX POST -H "Content-Type: application/json"
-H "Cache-Control: no-cache" -d @{} -u username:password
"http://192.168.105.10/homeaccess/services/aCStats/uploadData?username=vangeeij&filename=$(basename {})" \;
-exec sudo mv {} /home/vangeeij/acserver/resultsOld \;
问题
除了一个部分之外,命令的每个部分都按预期工作:
&filename=$(basename {})
我已经尝试了各种我能想到的方法,将find命令的{}
输出直接放在等号后面,而文件名前面没有前导./
。
在命令-d @{}
的早期,我需要./
但在这里我不
以前尝试过失败
filename=$(basename {})
filename=$('echo {} | sed "s|^\./||"')
老实说这个名单还在继续...
问题
在上面的具体用法中,如何在网址./
之后直接添加文件名减去前导filename=
答案 0 :(得分:2)
我建议您将find
和curl
更改为bash
中的这个简单循环:
while IFS= read -d '' -r file; do
base=$(basename "$file")
curl -vX POST -H "Content-Type: application/json" -H "Cache-Control: no-cache" \
-d @"$file" -u username:password \
"http://192.168.105.10/homeaccess/services/aCStats/uploadData?username=vangeeij&filename=$base"
sudo mv "$file" /home/vangeeij/acserver/resultsOld
done < <(sudo find . -type f -print0)
我们在while/done
循环中使用流程替换来获得这些好处:
-print0
和while IFS= read -d '' -r file
答案 1 :(得分:1)
考虑使用bash -c
执行命令:
find . -type f -exec bash -c \
'curl -vX POST -H "Content-Type: application/json" \
-H "Cache-Control: no-cache" -d @{} -u username:password \
"http://192.168.105.10/homeaccess/services/aCStats/uploadData?username=vangeeij&filename=${1##*/} " \
-o /home/vangeeij/acserver/resultsOld/${1##*/}' _ {} \;
或作为一个班轮:
find . -type f -exec bash -c 'curl -vX POST -H "Content-Type: application/json" -H "Cache-Control: no-cache" -d @{} -u username:password "http://192.168.105.10/homeaccess/services/aCStats/uploadData?username=vangeeij&filename=${1##*/} " -o /home/vangeeij/acserver/resultsOld/${1##*/}' _ {} \;
然后可以将文件名作为位置参数处理,您可以使用Bash参数扩展而不是basename
。
您可以使用mv
中的-o
(输出)标记来避免使用curl
。
Greg's wiki上有关此技术的更多信息。