Bash:在管道中传递变量时如何处理文件路径中的括号?



最近继承了一些脚本,并试图找出以下脚本出了什么问题,该脚本旨在将特定的TSV从多个类似目录复制到目标目录,同时根据源目录名称重命名TSV:

#!/bin/bash
ls /output/analysed/out/reports/sourceDir/sourceFile_(1.23)_reviewed.tsv | awk -F'/' '{system("rsync -avrP "$0" "$6"_identifier.tsv")}'

返回错误"/bin/sh: 1:语法错误:"("unexpected" .

我知道这和"$0"有关。在我的rsync命令中,更改它有助于克服错误。我应该如何将这个变量传递给rsync?有更好的方法吗?

首先,bash没有报告错误,正如您从错误消息中看到的那样,而是由sh报告的,因此我将用shellawk标记替换bash标记。rsyncawk执行sh.

下面假设sourceFile_(1.23)_reviewed.tsv是一个文件(而不是目录):

您正在传递给system一个由5个子字符串连接的字符串:(1)rsync -avrP, (2)$0(即从ls), (3) a single space, (4)$6(i.e. the 6th field from the input), and (5)_identifier.tsv ' .

由于ls的输出必须包含圆括号(因为实际上您搜索的是带有圆括号的文件),因此要执行的命令看起来像(例如)

rsync -avrP /output/analysed/out/reports/sourceDir/sourceFile_(1.23)_reviewed.tsv sourceDir

这确实显示了非法的括号。

由于您的ls命令最多产生一行输出(当文件存在时),即当文件不存在时没有输出,因此您可以将程序编写为

file="/output/analysed/out/reports/sourceDir/sourceFile_(1.23)_reviewed.tsv"
[[ -r $file ]] && rsync -avrP "$file" sourceDir

如果您出于任何原因想要使用awk,则必须确保在将括号传递给sh时对它们进行转义。

相关内容

  • 没有找到相关文章

最新更新