我正在嘗試編寫一個 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
,很容易重新放置。