复杂的find -exec,带有修改后的basename {}语法

时间:2017-03-11 07:50:12

标签: bash sed find cut

设置

我有一个简单的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=

2 个答案:

答案 0 :(得分:2)

我建议您将findcurl更改为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循环中使用流程替换来获得这些好处:

  1. 由于使用了-print0while IFS= read -d '' -r file
  2. ,它将处理带有空格/ glob字符的文件
  3. 它将避免为每个文件创建子shell,就像有问题的代码一样

答案 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上有关此技术的更多信息。