web-dev-qa-db-ja.com

ディレクトリパスにワイルドカードを使用する

私は、ディレクトリの一部が長くて不明な文字列であるbashスクリプトを書き込もうとしています。ディレクトリ名の最初の部分を知っています。パスで既知の文字列とワイルドカードを組み合わせるにはどうすればよいですか?今のところ、私は持っています:

ID=$1;

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

しかし、これはリテラル*を渡します。

5
Adam_G

いくつかのオプションがあります、

  1. NFSまたはFuse-over-SSHなどを使用してリモートファイルシステムをローカルに公開し、エクスポートされたファイルシステムパスにbashにデフォルトのFOO=/*/passwdグロブを適用させます。 (ZSHには${~spec}グロブ置換パラメーター展開があります。それ以外の場合は、シェルのマニュアルを参照してください。)
  2. リモートシステムにSSHで接続し、そこでグロブを実行します。 ssh Host 'echo /*/passwd'
  3. エスケープされた(またはバックスラッシュまたは一重引用符で区切られた)グロブをリモートシステムに渡しますscp Host:/\*/passwd .

これらのオプションのいくつかは、グロブが完了したときと、その(変更された可能性がある)ファイル名を含む後続のステップとの間でファイル名が変更された場合に、競合状態になりがちです。

1
thrig

Sshではなくtarを使用できます。

tar cf - filename | ssh [email protected] "cd /data/$ID/EER_DATA/$ID*; tar xf -"

パスワードの入力を求められないように、ssh-agentがセットアップされていることを確認してください。ワイルドカードdirをscpで使用できないと思います。通常のcpを使用することすらできません。

これをbashとzshでテストしました。

0
vjangus

「変数の割り当て」の右側は引用符で囲まれていると見なされます(分割やグロビングは行われません)。

LESS=+'/A variable may be assigned' man bash

変数は、次の形式のステートメントによって割り当てることができます。
名前= [値]
単語分割は実行されません、...パス名の展開は行われません。

したがって:

$ 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

注:2つ目の$IDをソースから削除しました。簡単に再配置できます。

0
user79743