在目录路径中使用通配符

在目录路径中使用通配符

我正在尝试编写一个 bash 脚本,其中目录的一部分是一个长的、未知的字符串。我知道目录名称的第一部分。如何在路径中组合已知字符串和通配符?截至目前,我有:

ID=$1;

IMP="[email protected]:/data/"$ID"/EER_DATA/$ID"*"/ImpostorScores.txt"

但这传递了一个字面意思*

答案1

有几种选择,

  1. 使用 NFS 或 FUSE-over-SSH 或其他方式在本地公开远程文件系统,然后在导出的文件系统路径上bash应用默认的glob。 FOO=/*/passwd(ZSH 有一个${~spec}全局替换参数扩展,否则请参阅您的 shell 手册。)
  2. 通过 SSH 连接到远程系统,并在那里执行 glob。ssh host 'echo /*/passwd'
  3. 将转义的(或通过反斜杠或单引号以其他方式去除)全局传递到远程系统,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,很容易重新放置。

相关内容