最近继承了一些脚本,并试图找出以下脚本出了什么问题,该脚本旨在将特定的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报告的,因此我将用shell和awk标记替换bash标记。rsync
由awk
执行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
时对它们进行转义。