ディレクトリの一部が長くて不明な文字列であるbashスクリプトを作成しようとしています。私はディレクトリ名の最初の部分を知っています。既知の文字列とワイルドカードをパスに結合する方法は?現在私は以下を持っています:
ID=$1;
IMP="[email protected]:/data/"$ID"/EER_DATA/$ID"*"/ImpostorScores.txt"
しかし、これは文字通りの意味を伝えます*
。
答え1
いくつかのオプションがあります。
- NFS、FUSE-over-SSH、またはその他の方法を使用してリモートファイルシステムをローカルに公開し、エクスポートしたファイルシステムパスに
bash
デフォルトのglobを適用します。FOO=/*/passwd
(ZSHには${~spec}
グローバル代替パラメータ拡張があります。そうでない場合は、シェルマニュアルを参照してください。) - SSHを介してリモートシステムに接続し、そこでglobを実行します。
ssh host 'echo /*/passwd'
- エスケープされた(またはバックスラッシュまたは一重引用符で削除された)グローバル変数をリモートシステムに渡します。
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
簡単に交換できます。