私が経験している問題は、サーバーのネストされたディレクトリに多くのファイルがあり、そのファイルを見つけて自分のホームディレクトリのフォルダにコピーしようとしていることです。つまり、次のようにすべてのファイルを繰り返すことはできません。
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
ディレクトリが参照されず、サブディレクトリに興味のあるファイルが見つからないためです。