在目錄路徑中使用通配符

在目錄路徑中使用通配符

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

相關內容