ディレクトリの一部が長い未知の文字列である bash スクリプトを書こうとしています。ディレクトリ名の最初の部分はわかっています。パス内の既知の文字列とワイルドカードをどのように組み合わせればよいでしょうか? 現時点では、次のようになっています。
ID=$1;
IMP="[email protected]:/data/"$ID"/EER_DATA/$ID"*"/ImpostorScores.txt"
しかし、これはリテラルを渡します*
。
答え1
いくつかの選択肢があります。
- NFS または FUSE-over-SSH などを使用してリモート ファイルシステムをローカルに公開し、エクスポートされたファイルシステム パスに
bash
デフォルトの glob を適用します。(ZSH には glob 置換パラメータ拡張があります。それ以外の場合は、シェルのマニュアルを参照してください。)FOO=/*/passwd
${~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 ではワイルドカード dir を使用できないと思います。通常の 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
注:ソースから2 番目を削除しましたが、簡単に再配置できます。