我正在尝试编写一个 bash 脚本,其中目录的一部分是一个长的、未知的字符串。我知道目录名称的第一部分。如何在路径中组合已知字符串和通配符?截至目前,我有:
ID=$1;
IMP="[email protected]:/data/"$ID"/EER_DATA/$ID"*"/ImpostorScores.txt"
但这传递了一个字面意思*
。
答案1
有几种选择,
- 使用 NFS 或 FUSE-over-SSH 或其他方式在本地公开远程文件系统,然后在导出的文件系统路径上
bash
应用默认的glob。FOO=/*/passwd
(ZSH 有一个${~spec}
全局替换参数扩展,否则请参阅您的 shell 手册。) - 通过 SSH 连接到远程系统,并在那里执行 glob。
ssh host 'echo /*/passwd'
- 将转义的(或通过反斜杠或单引号以其他方式去除)全局传递到远程系统,
scp host:/\*/passwd .
如果文件名在 glob 完成时和涉及该文件名(可能已更改)的任何后续步骤之间发生变化,其中一些选项很容易出现竞争条件。
答案2
您可以使用 tar 而不是 ssh,
tar cf - filename | ssh [email protected] "cd /data/$ID/EER_DATA/$ID*; tar xf -"
确保您已设置 ssh-agent,这样它就不会提示您输入密码。我认为您不能将通配符 dir 与 scp 一起使用,甚至不能与常规 cp 一起使用。
我已经在 bash 和 zsh 上对此进行了测试。
答案3
“变量赋值”的右侧被视为带引号的(无拆分或通配):
LESS=+'/A variable may be assigned' man bash
可以通过以下形式的语句将变量分配给:
name=[value]
不执行分词,...。不执行路径名扩展。
所以:
$ var=*
$ echo "$var"
*
要扩展星号,您需要使用不带引号的星号:
var="$(echo *)" ### Expand to the list of files on pwd.
在你的情况下:
$ ID=one
$ IMP="$( echo "[email protected]:/data/$ID/EER_DATA/"*"/ImpostorScores.txt")"
$ echo "$IMP"
[email protected]:/data/one/EER_DATA/something/ImpostorScores.txt
如果整个路径匹配,那么某些东西就会被扩展,也就是说,这样的树确实存在:
$ tree [email protected]\:/
[email protected]:/
└── data
└── one
└── EER_DATA
└── something
└── ImpostorScores.txt
注意:我从您的源中删除了第二个$ID
,很容易重新放置。