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

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

ディレクトリの一部が長くて不明な文字列である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}グローバル代替パラメータ拡張があります。そうでない場合は、シェルマニュアルを参照してください。)
  2. SSHを介してリモートシステムに接続し、そこでglobを実行します。ssh host 'echo /*/passwd'
  3. エスケープされた(またはバックスラッシュまたは一重引用符で削除された)グローバル変数をリモートシステムに渡します。scp host:/\*/passwd .

これらのオプションの中には、globの完了とそのファイル名に関連する後続のステップ(変更されている可能性があります)の間でファイル名が変更された場合、競合状態が発生する可能性があります。

答え2

SSHの代わりにtarを使用できます。

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

パスワードの入力を求められないようにssh-agentが設定されていることを確認してください。 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

注:ソースから2番目のアイテムを削除したので、$ID簡単に交換できます。

関連情報