権限エラーや複数のログインなしでリモートでファイルを見つけてコピーするにはどうすればよいですか?

権限エラーや複数のログインなしでリモートでファイルを見つけてコピーするにはどうすればよいですか?

私が経験している問題は、サーバーのネストされたディレクトリに多くのファイルがあり、そのファイルを見つけて自分のホームディレクトリのフォルダにコピーしようとしていることです。つまり、次のようにすべてのファイルを繰り返すことはできません。

scp user@server:"$find_directory/*.genes.results" $copy_directory

だからwhileループを使ってこの問題を解決しようとしましたが、ファイルは正常にコピーされました! とは別にこれは繰り返されるたびにサーバーにログインする必要があるため、非常に非実用的です。

#!/bin/bash

#read in starting and ending directory
read -p "Directory that contains all files to move from server: " find_directory
read -p "Directory that will contain all files from server: " copy_directory

path_list=""
ssh user@server find "$find_directory" -name "*.genes.results" | 
while read path_name
do
    echo "$path_name"
    scp user@server:$path_name "$copy_directory"
done

だから私はスマートでエレガントで小さなコマンドの置き換えでこの問題を解決できると思いました。

scp user@server:"$( ssh gordid@cadillac find "$find_directory" -name "*.genes.results" )" $copy_directory 

すべてのファイルが見つかりました...とは別に奇妙な権限エラーが発生したため、それらのどれもコピーされませんでした!このscpの両側に必要なすべての権限があるため、これは意味がありません(そして以前はwhileループでも機能しました)。

権限拒否エラーのリスト

だから今はアイデアが足りません。ループに戻って自動ログインを設定することもできますが、今は状況が複雑すぎると感じます。 StackExchange、あなたの考えは何ですか?

編集:これを見つけましたリソースこれも同じ問題があるようです。おそらく自動ログインが唯一のオプションですか?

答え1

tarローカルディレクトリのディレクトリ構造を保存できると仮定すると、リモート側でtarballを作成し、SSH接続を介してストリーミングしてから、ローカルで解凍を使用してtarこの問題を解決できます。

たとえば、

$ ssh user@server "
      cd '$find_directory' &&
      find . -name '*.genes.results' |
      tar -cf - -T -
  ' | tar -C "$copy_directory" -xvf -

rsync包含/除外リストを使用して、必要な拡張子を持つファイルのみをコピーすることもできます。rsyncデフォルトでは SSH が使用されます。また、リモートサーバーのディレクトリ構造も維持されます。

$ rsync -av --delete \
      --include '*/' \
      --include '*.genes.results' \
      --exclude '*' \
      --prune-empty-dirs \
      user@server:"$find_directory/" \
      "$copy_directory/"

このrsyncオプションは拡張子のあるディレクトリとファイルをコピーし、.genes.results他のすべての項目は除外します。コピー後に空のディレクトリを切り取ります。ディレクトリを最初に含める必要があります。そうしないと、rsyncディレクトリが参照されず、サブディレクトリに興味のあるファイルが見つからないためです。

関連情報